{"format":1,"manifest":{"name":"markdown-tools","publisher":"vyloxi","version":"1.1.0","displayName":"Markdown Tools","description":"Format tables, build a table of contents, toggle task checkboxes, change heading levels and sort lists.","engines":{"ferrum":"^0.1.0"},"categories":["Productivity"],"icon":"icon.png","repository":"https://github.com/voukengdongmofrankysteve/ferrum-market","license":"MIT","main":"extension.js","activationEvents":["onCommand:markdownTools.formatTable","onCommand:markdownTools.insertTable","onCommand:markdownTools.insertToc","onCommand:markdownTools.toggleTask","onCommand:markdownTools.promoteHeading","onCommand:markdownTools.demoteHeading","onCommand:markdownTools.sortList","onCommand:markdownTools.wrapLink"],"permissions":[],"contributes":{"commands":[{"command":"markdownTools.formatTable","title":"Format Table","category":"Markdown Tools"},{"command":"markdownTools.insertTable","title":"Insert Table","category":"Markdown Tools"},{"command":"markdownTools.insertToc","title":"Insert Table of Contents","category":"Markdown Tools"},{"command":"markdownTools.toggleTask","title":"Toggle Task Checkbox","category":"Markdown Tools"},{"command":"markdownTools.promoteHeading","title":"Promote Heading","category":"Markdown Tools"},{"command":"markdownTools.demoteHeading","title":"Demote Heading","category":"Markdown Tools"},{"command":"markdownTools.sortList","title":"Sort Selected List","category":"Markdown Tools"},{"command":"markdownTools.wrapLink","title":"Make Selection a Link","category":"Markdown Tools"}],"keybindings":[{"command":"markdownTools.formatTable","key":"Shift+Alt+T"},{"command":"markdownTools.toggleTask","key":"Shift+Alt+X"}],"configuration":{"title":"Markdown Tools","properties":{"markdownTools.tocDepth":{"type":"number","default":3,"description":"The deepest heading level in a table of contents."}}}}},"files":{"icon.png":{"encoding":"base64","content":"iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAjKUlEQVR42u19eZhc1XXn79x736uuql7UktDWYJDEKjaDDdiOQRaxg7Gd5LNnGs8YOx6HOMTYEy+x423slmC8TDze2LxkxgkRxI46JuMZe7DYBQIjQIARyAYvgEFqqdXqVm+1vPfuPfnjvaqurnrv1XvV3R+SVfV9LalLb72/e8496+8SWvxs6e+X/YODhgAGAF6/Xg0yn+ay8zoDnOsZc45hXiUE9WlmJhDNnM3+SXWf6ncU8l2zD8Vcb56+C/s26fMxpT2XWQpBmnkPEfZaAo8L4DEprAdXu5lfbNi2zQuuQYP9/eKywUHdCo6U9oQBQGwEuAL8v1100ZlTXH63NnwpAyfnlMrYQkAJ/9K2FCEvzdEDQSmBTzBhQr9LPWG4NeABgNKfW3k+R/u4esxwtEbR02WAnlWSbrNJ3fzndz60qzIRNgK0CTALNgG29PfLykz7/oWv+yMP+hPG8MXdti0yUiCvFHJKGlsIlkIQCCQIBK68UMhAcB3wkcBw4whS80nDIedwyJsnAT8V6NUR5vSah2Z+MwwGmD1mdrShoqfFtKvhGIMJxzUCuFsqfOXKO3beXo/RvE2AWqn/wfrXnuFq/jshcGmnstCpJHozGS8jhQhel0zNgHFCtRkOPCd6+tYGN+64Oaj6yp8ta6XoOwkiEMAMcEkbc6jsqIL2MO160My3kaC/veqOR59Kow1EEqnfBBgCePMfXLCxrM3OvCUv7ctmzZrOnF6Zy7IlSXlg4YFrwPfhp2DMqQ43AnyrIPhpPG72ubXnVH4aroeI7yr3oCbHhXxHEd+FHePfg6v3SXSPWWPADcfVfjQzXGbymIUtSa3o7ODju3J6ea7D5JW8lLXZecOGczYSwJsAs6W/X85JA1TUyeYLL1wJdv6hQ6lL8kpiVbZD21JKj32YiVKs8bVqGCmkPoFhmPQ+jATLTNK1uvpsnM6wpHT35ZAx4GDCSEFwtdb7CmVZcD2UPLNVuXjflffvHGq2JEROgHvWr1cbtm3zvvfa155nS/5Rh5Irl2c7vCUZW2pmMnXAJ1KdlE7ttoFvtmzNXEUAEIJ4tFjWB0uOKnp6yIH+04/c9cQjFSwTLwFb+vvlhm3bvM0XvfY8pczWTkutXN2V95ZkbOUyExManDoOeRmu03cc8pJRdkKtLuSYwakfXKaoe0Tdl2OPC70nVYw7TnCPxomZ5L4cKfWNZ1Dwm2eYFndkVF9XzsvZaqWC2HrDH77yvA3btnlRy0HDBOCBAXHZ4KD+xwtfcz6z2dqlrN7VnXndIaVymRcAeI4EHkmBx8IDP9ulawF4apT6psBTPPBhQuOC0aGkekVXTudtq9dAbL324rPPv2xwUA8MDIjYJaBi7X//4guWuQ6e7LGtZSd05rWSQmrm6sFzWedjHaoF9+fn4svHRQWSjEHCcwkJz4geAw48Bs9o/eJkUU447nCWnbPef/dTwwN13sGsGXF6fz8BgOPw5ryllh2Xz3lWDfiJpCdWDUfM4CbqPlLiaeElvl7dtybxvCASHzUGvsdgoISQKzszXs5Sy6bI2swATu+fLfSy3uJf/frXDOQtecXybNbrsS3lMSeLhFHCIE4M8IklnhY2gjcDSAsSTy1IPCFVyImpWejbF1gDwBZSENhzDZ+0/fgVfMVPhu7Z0t8vB3fvrlFsAwOCNm0ymze87hT2zK5jOmx5fGeeHDb1hn7bpVtQyz6dqo+barVXkoL4pckijxRL2lLyzKu2PvpMBXMBABuDAz1XX9tpSWt5toO9ZuBTHCh8dFj21IJlT3GWfZPni3yWiEUjGDvNTMfkbe60Lavs6mt9zDf5h1RU/80Xnb+BSNy9Ktuhl2U7pFuz7qcLv/Lvv8TPer4U586DgZdE4usxYgCKCAcLZT1UKEvSfPEH7955z5b+/plUXdnw5/OWxOKMjcq6HyXxbZdu4V26eCM3WuLDMKIgm9iTtZC3BEqsPw8Agxj0H2vzxa9fp93yk335nFiZzZJb4/K1XbqX16VrReLDzmUwlCDsny7x0GTJdNh81gd++sRuAQDaLb+3x7Jlr23rWn+/7dK9/C5dKxLfeDcfU20Y3RlLd3VYsuTivQAgtvSvs13mt1pSwhZC8GELfOvr/MsBPOYAfFOpT+w+1z03ARklhC0FPMZbt/Svs1Vxf9daAXNiXkmQIGHq1X/bpTt8XDpKH/vguncikMgqCQJOPDDWtVZp5ouySmU6LGkMWLSBn78sHRKeN1/rfBTwtZcwzMgqYXKWypSNc5Ey4AtsJZARgrmmkKXt0h05Bl4z4Os/thJsSYGC512gjMHpigiSiHRCq/7wtOznAvyRadmnBR5BeFgQkRSAMeZ0BeK+4CEJ3Hbpfl+Bn32GH+RlgT4lSPTZQkAQSDMa/P828IcT8HXnU8oKZVRL+MgSBAHRpzQzN8yhw7TO/uUC/rCz7FsAPux7zcyqWsDKyRoz2i7d4eHSzQX4GZcQpKoPI3wLoQ38keHStZIWrjUEK5dU9dE7art0R7iBlzzxxgBU26X7fQA+frGKmwyK25b9UQV87X2IAg0QtQS0gT+8XbpW2t3rcwMqKkvXdumOLJeuVSNX1X+z0FLfdunm36VLq/lqj1XVnLQA2NQtAW2X7oiw7FtlWgk1AucNeKIIy57m4NLRHCdNzMg35SegFsAPeW5KwTFQey7zvAEfvgTMA/AkBEAE1hrsefPg0s3lpTkxDcv8Sjwn0ixp70tCgKTyVbjRLUt8+BIQESpMLPGBtHvTU2BjILJZWD091f711qKLL5dlH/H2C7TONwU/cM28YgHO1LgPWjYPkhLGmJZzN5WyMsVzVPUkBIzjgLWHRee9FksvvBi541ejY0VfI4FA+xM6rlSDdBTDQnnsIKZeeh7Djz2AoQfuhFuchsp1ztIGSWI6swWA6+MA3DwUXAe+V5hGZtkKrP3QJ7Do3PPbqC7Qx8p3ofPYE7DiNW/Amj95F5767t/hwJMPw+rqARuTOJJbX6gq33p838YuW6HbVjANJWHNwe9adyZOv+bryK850X8QNvUcSe3PvGgL9sfWMDKLFqNv/VvgTE1g9OnHIDuyAHPChlqGIMKU42HK8SAQR/AQs+Zr14F9zDKc+t++BKt3MVhr31AR0jcG2595/RAFYysl2BgQEc58/99i+fkXwZ2aBIRoUnYfjqxI3UQZLFrGc3HSRz4Dq7vHB1/OMJCwMbPpvNo/c/7xtStXtS8zA8w4+6rPoWPJMTCuW7W5kgDPcaHguCwdCQFvegq95/8Bes5+VQP4M4ZhGcZx2oZgRCSCU5xNRFC5zoYxZq2R6enFCZf24+mbrkOmZxFM1SjkRM+jUkfwiGC0xjHr3xTCbusbkc9v/i4ObLsj9GEO92RNKy4d1VjvleARNeNDbuIOzzR0+f/qPeUsnHXlp2B1dvuagAhEPm3kqte9Cc/e+o8wxquhjErWiKvSJmvYGMhsHrlXrJ4VA2BjQELg+Zv/Hs/907dh9Sya/Sx1dgEbM7/AB9evxh4Cy3ihw7YkJYzrgtlAWFagmg3C+qtajt4Jwu/u/jGcqQlc8NlvgKQMCDD9kzp6lyK7dDmmh16EsO2GC0QxmXDYBIjN0hGBPQ9WzyJklq8MvvJnIQkBXSpi+N6tsHoWzQyGr6+gS4UZ24AZMpcPjTdQwgge1XskxYLvE9dcn+saXRFT9URhz5Jg9XKnJ5HpXQqhFEoHh0G2DWHZAIe9G8K/o+bHZZcsw8iuRzDxwq+xaO2pVYFjYyAzGeSWr8Lki7+FzGSq456E26ExDpCkASQwQBq+9zywdqvHcDAxvMI0ek4/C8e943LIbA777vwJhu76CVQu708q5nQSzzWDJQSciUPoPfNVOP7tl0Nm89h7148xdO9tvntU8Xy5BannJgax0TjpP1+JY9/4p5CZDIYf3Y5nNt8Ad2ocpCyAE9Lic/OlgdnXmF5pOopdPsGSElISxrXJmhbIHBpDwjOyREJAFwvoPu0MnHX1NyEsCwCw6IxzsPjc1+CXN3wZMAYQ0URDcVk6kgLe1CTW/KcrsPqdV4CUP597zzgHVmcnXvi/P4Dq7GoIlMw1bEtSwJsYx0mX/xVOvOwvqv/X94a3oGPxMjx89X+FVFZ0ZK6VsvtqFY9IwVTePMwtfODTs2QkeQAGYAzjhHf9BYRl+WulMWCtseyiN2Lte6+COzUBEjIxG1ZVU0kJd/wQlq+/BGsuv9L3j7UGaw0wY/VlV8BevBTG82bslKh+e0qWm6+6wK4Le/ESvOLN/9F/n8BFM56HJWe9Gr3rXgmvWKzGQ+J5AxK20FMCHqFY3oDw5n5RsSiZ0/bMN+ehNq6LzNKl6Fp7CsAMoVQQLBJgz0PfW96BlW98K9zxMZBUickSKpolf/xanHrlJ6oAkAwCJcywurrRveYU6HLJf7+5Al8rPcy+ig/ehQJfvQK4yuaqKpvnhTshobOeAvhKfEE4h0b9Qaqx0qOB5+aEB/UvHcrvTlWgTr7y48gfvxa6WPCjWc1YMoj8LJgQOP2jG6HynaFehj+Itc7YXIEP3p4ZwrLgjI1g+sXnQnP1Rjd6OAsKPFIAX1maPQ+liVEI1hrO6AicsYO+4VY7kDGESElnYWwKmRkq34l1HxsApACzaaquISTcyQmcfMVH0H3iqdUQdPyCxLEEi4mArzvOMPvLTRwBJiUHHq0Cn6CkpF7qy1PjKI7th3bLEP6DCriTEygP74MJJBGCQiU+cdQwwYtUolldJ56Kk674MNxJ3x6IMtJIKjgTY1j1prfh2EvfERqFTMOz1wz45r47pajpS5elS22A1zE0NsYSBLTnonhwP0qHRvwlkwhiZl2VMJ6L0sFhlEeHYTynwYjhVHMvoaUQGG99l/r2gDM+GoA6+0p+nKGAzhPW4tT3/03VxUzGD9Qa8NwSCNG5+ebqvlXgY4p6hACDUZ4YReHAXrilAkAyJBlEDBZ+hMWbnkJpeB+ciUPVwU/+QOlVVyW5ccpf/s1se6BG0gwbQAqc8eGNUPmuajh0LjsitQp82onQ6jqfhD8xziUnIeAWpzB9YAjlAEvfVprZ1kfMrD0zD1IBxDk0htLwPnhTk42G3PzmOgN7oAunf3SjD341owhABuv+nydZ99OAkl7io0ie5xv4BpeOEr4ZESAEPKeEwsF9KI4Ow3guUHW1eVbOQsQxXpIQMK6D8ugISgf2Q5eLIEGhFndray832APdJ56Kk6/4CNypCUAKQEo442NY9ca34bg3h6z7zC0Aj5aA5wQUbZhv4JMW6BEBQkJ7LkpjB1AY2QevVABIBIJrQu0aVfGQTVhrWPXCBOMUUR4pA0ohl8kkq7il2I0xq5Jf0SwVe+DYS9+BsWeexNA9t0FmOtB5/FqcFrbuh1wjDfDz1VyRTAB4jtE7jt1GT3suSocO+Mul5wVCSg0F7lyHkeAI4BtmOwkwEXSpAOfgcGgdWiKpDyS2dHAYL/3032aKHersgdPe/zfIH3sCvHIRZ35sU8O6X1kiDux8AKNP7Zz5rsk6P1eJT7rr5+zoXXKJj6J1aXbv8vhBlCfH/SxkVUgidmSq0UiCIzdLCF8viQgcZwsISuQ5qGwOv7752xj9+cPVrFa9PXDaBz6JdR/4FLrXnFLNflUmEQmCM3EIu67dBKN14hU/VS8dIXXFbRI9wTFSz5Gk+wmmXtXAi4r+NRqSopKyNxG7VKWKAzCDtVeNI8ROASFBSuKpa6+BM3GomlauNpgwY/EZ5+K4N7+jmm6eVXIGwtM3fhHF4SGojmxqpzT9Tl1pwU8IfEwEr359Z2P8YFlaJzwE+MoxwsxO5EXKTKKaQWYUD+xH6eAwdKkQGaL1jQ4DkelAcf9e7L7+iw1LQXVtr1vfK0bgb2+9Cft/drdfFh2hAeZb3c8lPsdpY/aV3EJQgFsaP4jpA3v92r9IKyH5Zhsz9QCRDxMT0Ihd4w286UkY1wEDyMV4DKw9WF092Pezu/HcD2/C6v/w3tlWft1Sw8aApMToUzvxq3/+NqzuRXAL0ymjk/OUnqUWYgCxBh7VlHkBRrtwSkV4xSlo1wlyDF6yCUjN0vkzJqGK2w0stWVfuxYRgZ0ynMlDkQZjpb7Q6urBr275NnpOPgOLz3zV7PW+ZnkhIjjjY9h13dUgoWr8lxYiZHMBnlqQ+KjRJQLIz8ob7cItl+AVC/Dckq/ZKpNCyERxGKZGzzi87oprI4GcmtY90YtXYgYUbi9op+wbllKClIVd118DZ3xslj1QX2r+1A1fQGH/XohMxm+UaCUcm0TVh5Vmi4gdqBvOrzlPUJCVpKCgg/z6BxF4Va4Ld3oShYP7MT28F8WxA3BL01W7hxpS2dzCfgMRLrBPEVOXcElQcctJVFBFDXF02qI0sh/u9BRULg+Vz6Ow93d46sYv4txPfwXG86oDYDwPwrLw2x/ehH0/uwv2osVVYzNVnDyFxBvXAZEI9+ODeoaoIBQbDaM9X2XXRjSNgdYa2inDeC6M50A7jm/cEaq1EnEsny3ZHPXGYc2yrzhmj9uklDBhOWlKGAJmz4E7beBOTUDYGTz/o1vQeewJOPk9H5wZb8vC6NOP41c/+A7snt5qRTGlGYik4LNf8pVdugKeU/Ijn3WtnEQEYVnVEjQ09PHlYXcvgpXvBGsP2ilDuw6050E7JZCU0K4Dr1T07R0pYog5uK5EvPlE5xiJrxdilb7OnueUCIlKWjAzjOdCZrJ46ltfRmn0AE5615WQmSxeuvNHeOafrvfvTCKoxJHVuHfUVJi1fRon6Xr2VbZbLuLUP/kgXrHhbdClog90LaMu+UuY6sjNuK01f5/zgc/7GipYyipxCjYa0srg0G9/gbs++W4/1C0ooq8vjCaiRQKpmMmv6jNNFCvx1EJqMmXuUAgIO4NnNn8LL/z/f4WwLRSHh0CW7ReVVku/FEgpv85QuxFzywfUN6RE8/LroIJJWhZ++YNvY+m6c9B13JrULl90XAJwC1N4+LrPoTwxCivfDTY6OfsXJRv5dBQxMfvPxnbW0NyKQSKja4E02D098ErT4KKB6vTDwMwzJWGsyyDPgTs1BaPDfePyxBgKI0Owi93+YwdVyVxDXMKEml4DrhqcbmEad3zo7bjkOz9GfsVx4RnIKKu83oCt9kcAd33ycgzv2oFMzxIY7SWo4klascypbJ0mFDHxwMcn4EIKL9OqL4LfViYlCDK0y4cCqfYrisNvYpwydKkAT1m+pBWiiRLq/yWUQmF4L7Z//q/whv95C+zO7qBvQiRLb9cCYwyEVNjxtU9h6NH7kFm0xE/YxBl41GLQieL7DOrHWqTZngxpq1MoZV6eeHbkKogExkXlmDgeCBLVH791XQLS/yEpZixvIfzwdNDezsbA7u7Fvse248GrPxiEp9OlnwHAeBpCKuza/E3suuVaX/Kr4Idssptiq9zmhaFx7qB/XxGbH09a4BkWKKF0cfN0u4XW7u6dsFa+UvVUPafSbs2RlUHGc5Fdsgwvbv8pHv7ap/36CKOTg689CKXw69v+BTv//ovILl0RqH1OJfWtloRFRh2ptjGkSbVLq/HwZDOWE+ybF7WtOyefmBEFGUk2h9bag92zGE/fcj2eufV7EFL5FTbN3l/7kj/yyyfwwP/4CKSdCXoFuMUNsrlJRUCC6uaQsRZR/nJ8Fmx+qgI5bQKHOAUJ3IwNkroKqG5ndNYeskuOwY6vfhLP3XErhLJ8Ny8yHeLnMw49/wzu+Pg7IcRMwwpaAD7Ksk9CAxcFfMMESFbHns6yjz2aeVaOIJm6D1Hrdddp5h5xqy1VDEi7Aw995eMYffZJn7MvZDnw07UEZ/IQ7r/mKpQOjUDYmbpMZzrgOWVL3gzw3DQ8LOKizLG9dC1lxFFN+8psHl2vWONnuuosa45R97N4ijwXmd4lVV99loXOPD/AV/7FBsKyoZ0y7vjoOzG97yW/h6EWWK7szUm4+zP/BcO7H4PVtWjG3Uts4HFIh1VSzZoM+Go9AKepmqX0lj3DNOT62RgIpaByXeFaIA742uOYIS27gSqt0mEUtma22kTplzBoiEwWpfERbNv4lyhPHKqRev//iQgPfe1T2PPovehYtNjPGaQCnlssRUsGPMI0QFxNSRjwSTtUyM6gcGAI+x64M3CtNDiwjKf3vIADTzwElc3PsIUkBT4AX1gZTA3vwZ7tP519fakwtfcFHNj1CKxsfnajZgvA144BGw921yIMPbYd9//3GffQeC6EVHhy8zfw5C3XoqPi7qUFHulrEMOihJykBoIaloDmwHOzcuwaX57ZQGU68MS1G7Fvx71++FYqTDz3LB7a+CG4hSlAqiDGn75o08BAdnTg8Ws3YmjHPdXrjz//LB7cdBXc6Smg1viiZD3zzfgJdOAe/m77bXjo658CCQGhLPzqth9g53e/iNzSFTBGN63GCTXwmnpfHBt95CTGNVXGmSpUsdx0E4Mw4uLQ9b22k4gZpGyUxw/h/o+9G0vPOh8qm8PIk4/AnZ6EyuXB7KXYYaPu+dhAKgvliTHc8/HLccxZ50N15DCy6xE4levX8enOBfhZ6WLPRaa7F0/e/E0sOfksLF13LrZ/+cM+RUvI4tNqsqbynagmnGREi50KdRIbC1O4niKGE780wICQcKYmUTq4H525NUEEz4+cWblOLD37Ajz3//4Z2WNWVtdGGfQRjPx8B4wxULk8rK6ugNNHxFKoUcizUQ0dFAMQmQwEgAM/3wFm38C0AmYQkiKU9J1rfqMQ9Rj9LDU8YMzILVmOh28YgLQzELYNoWww+0SOUUT3XHtfQmTWj2tIIksTY+jpW43Fa9YF1VGiGhI3roPCwf0gacUQXYdrV8Ux1SShvRxKwRkfxeQLv0HnsauDlxXVFz7n419A6dAIhnc+MOti1YIHKaBL0/CY01HH02wyHa6LfVe6nCEkvGKhmlNIvc8Opdyjh8i3MdiApIIulUI0KM9x+z1Gd99qvHHT92Dnu2dK5tgAJFCaHMP40POQtg1TuzRTdCFJlSgy3a7gXB3YvfffjpWvfxNgqCYBwsgsWoI3XP+vGP3FE/AKhWA54NZbSKn1oBLm3GGf8OqV5A9zqsKUZA/CgBA45uSz/fqDmhJ5YwyEFHjxkXtRHBtBpqc3qCNsDnwESxjiK1MoMOw6u/C722/FKX/2QXT2neBHvipZuSBlu/i0V6L9medJGWjbqn0FgjEaTw5+a4aajtIRVKrmXS91qpQZJBTcwiQe+cLHsOHGW/31sKKWAk3AhhdALnF0k0XXgO8nmizs+M4mDD/zODLdvQFTaMLiWKoWhcao+4h1yhgNle/C8MP34bGvfBrnfuJL1Zg5hACB2ozhC0EYzwwEgiaUhV/edgse+/43YXd1h4Lf3Lvh2VvGVBkzE7hlrDXsnsV4dsv/xvS+l3DeZ76KjiXL6tq32p950wBC+MpV+kwuO/7XNXj8X673Gcla2juQZ7yAegMv6RpijIbdswh7tm/F2Pt2Ye3b/wzHbXgbciuOi62La3/Sf4zWmB7Zi5ceuw+7bv0uhp95HHZnT0MQKAnwszggrjl7FS/PKqzIWnA52ZYxXOdmkJTQThluYRp2Vw9yy1Yiv+r42Q51yv3wmhM8pwviJN1Iqfnk51ReCEcUvyT1QvxoB6EwNoyJoedRHD8IoWxYuXy1JzIt8IqAAwWNkaKGmgkLpge+qje0BikLmUX+ziGTe17Aoed/1UBcHleDl7atal59+TnuJJZk0jQPssXFQXySTWHZyHT1+tfTOhXwc9s9PAL4en+1Uv8u7AxkJjvvoLcatm1acTtPNfZpJL75GNTdl4MAs9EJJz8n0koqjtI8EfBRkwG6ttY7HfDcgqrnmMKIKOCb8eqHFGwmYfZukHpOuVQQp7hPeqmvfZ/Q1rCWgW+Y7TzH9mw+yqQ+Hry5AB/WSJp+w4jE4M9F3beBXyjgw3IjjaFg4jmSJfBRBvxM4eWRA/xMEYqabXRwG/ijAvgqJWiFIuZoAx6pmyiPfODDmQZVXBnW4Qn8XPPrRwjwCVy65PGM6FCbOiqBTxXESRfIaerPvwzqPlEcgJtSxLRduiNtnUcCjiRVYeJru3S/38CHlZszwEpQ3e3blv3vLfANTSEEUoaxx2XuM5Uao6NS4o8e4AN6I/YMkzZmjzLAHgb6almQ2i7dkeHSpceotraICYw9QjCe1mzgMYfS+s1XS1WiRsjULBnJe+nC26aT99LNHgNu3ncYyZaS4tzQMQhvOuFEXd7+t5qZtWGQwNOCCDscw3BNY8HQwgPPcwceLQAPTt9Lh9l9i63RzqeQekoSxklK48OzWmE8A3INAIgdSti4r+iYcklzpkMRDIfX5Lct+yPLwIuLm5S0ESVtyorpPqEnF/+Gwb8uau2n8ZtsYtC61PMc1D2H98wnkvpoepQFUffUgroPHYMm58aOQeO5Na6fKWnAMP160eTob8Sm3bsdIvETVzMcZkM1D3NkA4+jEPjwhaLybESAa9h4hiEIP9m0G44AgIzCTVOe0ROuljPs1Ec68HwUAs+RDOIcdLBNOkYWHKM7JG4CANHfD/nZh/ft9tjcX/QMecZoitmCdGGBx1EIPJIxmaQBPsLW0Qa67DFp5vu/un10d38/pOgP/tMSdHXRY0w42ucvbrt0h71LFwl83TiYYOuGKUej5BlIEldXo4GXDUIPAGJg5/57ymxuH3eNdDRr0XbpDnuXLm4nk9paTwHA06wnHSMdzbdf9+DBewYGIAYHEeA84J9kk/zromfc0bImomA/DkpBcZLapePEdLRRjJdJa+0bpR5HvGWPBNwOwdrPoyVNRZddi8Rf1x4rAWDbNvCWfsir7pw8cGFfp2BgAxF0zpLCNFY2x/vy1IIvTy348tSCL08vp8RjDhKfbO+isGVCEDBZNnraYakNrrnuwdEf9vdD3ngjGuW7H5BbAPO5V6/YmlPiTStzyrMlKc31FCftZM3CB3EQreoTsooIAhzN3vC0VkXX3HHjg2OX9Pf7qh9hNHHrgutnpXlP0TPDw0VPeYa1IJ4Tx23bpZtfly7+PRgGDCLAM9AHC0aVPR5W2noPAAwO1u3rVfvLJsAMDIA+u2N4v2b+42lXj+0tuNKfBHVbsLRdupfNpYs7lwFIAjRDD09rWfDMGDT++Nodw/sHBkD1++yF9qlu6Ye8bBD6c69ecR7AW/OW6F2WVZ6thNLM7cJLmvf0bIs1ko3nCuGr/ZGCUUXXjGlNl3zrZwcf6e+HrFX9kUyhAHDZIPTAeqhrHt33CECXFDwztLfgqUOO50kipjhm6rZLN+8uHZpoi8r7CAGeLBtv/5RWRccMVcAfWA8VBn7TLvqKJvjMq5auFFL+gy3okqwSWJKR2pIkNdfvQ9nO0rWcpUs8BlzDHVDdmxKuZj1WMrLkMVyPtyoh3veN+0eGoiQ/MWlZ7QU+e97yjQx8OquE3WOT6bYkC0HCMFPtJtRzJUtoAx/f0UOY2cxUG5gJx1ChbETRYwfgL93wwNjGeuyiPrLZBNi9GzwAiHsB/OHe6Xtfv6rz/2g2q4ueObmkWTiGyZLkKUl+CJnCC0tCN21Ia+Al5C+KI0VKR8ywwCSTKYgpgJqdaAXYNazHyywnykZMOYYcg9uk4v7r7x/bEoySuHE3zDzRMM5eEgBg4Pxj/kgDn9Cgi/OWEJYgdEhChxRGCWJJICZ/x77ZPMSNO/YlJ0vgFKBT3eBzCtDjzw017qiRsCCS4IIS8g0QwwTOkA4KOUuGRdljuBoouMYQ8d2C6CvX3T96e1Kpb3kCBFFjsbHGA7r6NcvOLDHebQxfysDJHUpklCAI8lWBEsl3vp0bnWrYG82/qp9zwWbiCKb/pxfIsGaGa4CyZ8pE9KwEblOSb/76fWO7KrpxI0CbAJN2l7mWPv39kFsGYSpjMLAeSpaXnVYGXmeYztXGnMOMVSTQZ5ibbvUbDwqldumiNl1N3vqWbHficFXP4c+dZqcVBgsBMsx7iLBXCHpcEj8mCA9209gvNm2DVwH+srroXprPvwNFeOooJ06thQAAAABJRU5ErkJggg=="},"extension.js":{"encoding":"utf8","content":"// Markdown Tools: format tables, build a table of contents, toggle tasks, shift headings.\n\nfunction splitRow(line) {\n  let s = line.trim();\n  if (s.startsWith('|')) s = s.slice(1);\n  if (s.endsWith('|') && !s.endsWith('\\\\|')) s = s.slice(0, -1);\n  const cells = [];\n  let cur = '';\n  for (let i = 0; i < s.length; i++) {\n    if (s[i] === '\\\\' && s[i + 1] === '|') { cur += '\\\\|'; i++; }\n    else if (s[i] === '|') { cells.push(cur.trim()); cur = ''; }\n    else cur += s[i];\n  }\n  cells.push(cur.trim());\n  return cells;\n}\n\nconst isSep = (cells) => cells.length > 0 && cells.every((c) => /^:?-{1,}:?$/.test(c));\nconst width = (s) => [...s].length;\n\nfunction formatTable(text) {\n  const rows = text.split('\\n').filter((l) => l.trim() !== '').map(splitRow);\n  if (rows.length < 2) throw new Error('A table needs a header row and a separator row.');\n  const sepAt = rows.findIndex(isSep);\n  if (sepAt < 1) throw new Error('There is no separator row (like | --- | --- |).');\n  const cols = Math.max(...rows.map((r) => r.length));\n  const align = Array.from({ length: cols }, (_, i) => {\n    const c = rows[sepAt][i] || '---';\n    return c.startsWith(':') && c.endsWith(':') ? 'c' : c.endsWith(':') ? 'r' : c.startsWith(':') ? 'l' : 'n';\n  });\n  const w = Array.from({ length: cols }, (_, i) => Math.max(3, ...rows.map((r, ri) => (ri === sepAt ? 3 : width(r[i] || '')))));\n  const cell = (s, i) => {\n    const gap = w[i] - width(s);\n    if (align[i] === 'r') return ' '.repeat(gap) + s;\n    if (align[i] === 'c') return ' '.repeat(Math.floor(gap / 2)) + s + ' '.repeat(Math.ceil(gap / 2));\n    return s + ' '.repeat(gap);\n  };\n  const sep = (i) => (align[i] === 'c' ? ':' + '-'.repeat(w[i] - 2) + ':' : align[i] === 'r' ? '-'.repeat(w[i] - 1) + ':' : align[i] === 'l' ? ':' + '-'.repeat(w[i] - 1) : '-'.repeat(w[i]));\n  return rows\n    .map((r, ri) => '| ' + Array.from({ length: cols }, (_, i) => (ri === sepAt ? sep(i) : cell(r[i] || '', i))).join(' | ') + ' |')\n    .join('\\n');\n}\n\nfunction slug(s) {\n  return s.toLowerCase().replace(/[`*_~[\\]()]/g, '').replace(/[^\\p{L}\\p{N}\\s-]/gu, '').trim().replace(/\\s+/g, '-');\n}\n\nfunction toc(text, min = 1, max = 3) {\n  const out = [];\n  const seen = {};\n  let fence = false;\n  for (const line of text.split('\\n')) {\n    if (/^\\s*(```|~~~)/.test(line)) fence = !fence;\n    if (fence) continue;\n    const m = /^(#{1,6})\\s+(.*?)\\s*#*\\s*$/.exec(line);\n    if (!m) continue;\n    const level = m[1].length;\n    if (level < min || level > max) continue;\n    let id = slug(m[2]);\n    if (seen[id] !== undefined) id += '-' + ++seen[id];\n    else seen[id] = 0;\n    out.push('  '.repeat(level - min) + '- [' + m[2].replace(/\\[|\\]/g, '') + '](#' + id + ')');\n  }\n  return out.join('\\n');\n}\n\nfunction toggleTask(line) {\n  if (/^(\\s*[-*+]\\s+)\\[ \\]/.test(line)) return line.replace(/\\[ \\]/, '[x]');\n  if (/^(\\s*[-*+]\\s+)\\[[xX]\\]/.test(line)) return line.replace(/\\[[xX]\\]/, '[ ]');\n  if (/^(\\s*)([-*+])\\s+/.test(line)) return line.replace(/^(\\s*[-*+]\\s+)/, '$1[ ] ');\n  return line.replace(/^(\\s*)/, '$1- [ ] ');\n}\n\nfunction shiftHeading(line, d) {\n  const m = /^(#{1,6})(\\s+.*)$/.exec(line);\n  if (!m) return d > 0 ? '## ' + line : line;\n  const n = Math.max(1, Math.min(6, m[1].length + d));\n  return '#'.repeat(n) + m[2];\n}\n\nfunction sortList(text, desc) {\n  const lines = text.split('\\n');\n  const sorted = lines.slice().sort((a, b) => a.replace(/^\\s*[-*+\\d.]+\\s*(\\[[ xX]\\]\\s*)?/, '').localeCompare(b.replace(/^\\s*[-*+\\d.]+\\s*(\\[[ xX]\\]\\s*)?/, '')));\n  return (desc ? sorted.reverse() : sorted).join('\\n');\n}\n\nexports._test = { formatTable, toc, toggleTask, shiftHeading, sortList, slug };\n\nexports.activate = function (context) {\n  const reg = (id, fn) => context.subscriptions.push(ferrum.commands.register(id, fn));\n\n  /** The block of lines around the cursor that look like a table. */\n  async function tableAtCursor(doc) {\n    const line = doc.selection.start.line;\n    const isRow = (t) => /^\\s*\\|.*\\|\\s*$/.test(t) || /^\\s*[^|]+\\|[^|]+/.test(t);\n    let a = line, b = line;\n    while (a > 0 && isRow(await ferrum.editor.getLine(a - 1))) a--;\n    while (b < doc.lineCount - 1 && isRow(await ferrum.editor.getLine(b + 1))) b++;\n    const last = await ferrum.editor.getLine(b);\n    return { range: { start: { line: a, col: 0 }, end: { line: b, col: last.length } }, text: await ferrum.editor.getText({ start: { line: a, col: 0 }, end: { line: b, col: last.length } }) };\n  }\n\n  reg('markdownTools.formatTable', async () => {\n    const doc = await ferrum.editor.active();\n    if (!doc) return ferrum.window.showMessage('Open a Markdown file first.', 'warn');\n    try {\n      if (doc.selectedText) await ferrum.editor.insert(formatTable(doc.selectedText));\n      else {\n        const t = await tableAtCursor(doc);\n        await ferrum.editor.replace(t.range, formatTable(t.text));\n      }\n    } catch (e) {\n      ferrum.window.showMessage(e.message, 'warn');\n    }\n  });\n\n  reg('markdownTools.insertToc', async () => {\n    const doc = await ferrum.editor.active();\n    if (!doc) return ferrum.window.showMessage('Open a Markdown file first.', 'warn');\n    const max = Number(ferrum.settings.get('markdownTools.tocDepth')) || 3;\n    const t = toc(doc.text, 1, max);\n    if (!t) return ferrum.window.showMessage('This file has no headings yet.', 'warn');\n    await ferrum.editor.insert(t + '\\n');\n  });\n\n  reg('markdownTools.toggleTask', async () => {\n    const doc = await ferrum.editor.active();\n    if (!doc) return;\n    const line = doc.selection.start.line;\n    const text = await ferrum.editor.getLine(line);\n    await ferrum.editor.replace({ start: { line, col: 0 }, end: { line, col: text.length } }, toggleTask(text));\n  });\n\n  const shift = (d) => async () => {\n    const doc = await ferrum.editor.active();\n    if (!doc) return;\n    const a = doc.selection.start.line;\n    const b = doc.selection.end.line;\n    const edits = [];\n    for (let l = a; l <= b; l++) {\n      const text = await ferrum.editor.getLine(l);\n      const next = shiftHeading(text, d);\n      if (next !== text) edits.push({ range: { start: { line: l, col: 0 }, end: { line: l, col: text.length } }, text: next });\n    }\n    if (edits.length) await ferrum.editor.edit(edits);\n  };\n  reg('markdownTools.promoteHeading', shift(-1));\n  reg('markdownTools.demoteHeading', shift(1));\n\n  reg('markdownTools.sortList', async () => {\n    const doc = await ferrum.editor.active();\n    if (!doc || !doc.selectedText) return ferrum.window.showMessage('Select the list lines first.', 'warn');\n    await ferrum.editor.insert(sortList(doc.selectedText, false));\n  });\n\n  reg('markdownTools.wrapLink', async () => {\n    const doc = await ferrum.editor.active();\n    if (!doc) return;\n    const sel = doc.selectedText;\n    const url = await ferrum.window.showInputBox({ prompt: 'Link address', value: 'https://' });\n    if (!url) return;\n    await ferrum.editor.insert('[' + (sel || 'link') + '](' + url + ')');\n  });\n\n  reg('markdownTools.insertTable', async () => {\n    const cols = Number(await ferrum.window.showInputBox({ prompt: 'How many columns?', value: '3' }));\n    const rows = Number(await ferrum.window.showInputBox({ prompt: 'How many rows?', value: '2' }));\n    if (!(cols > 0 && cols <= 20 && rows > 0 && rows <= 100)) return;\n    const head = Array.from({ length: cols }, (_, i) => 'Column ' + (i + 1));\n    const body = Array.from({ length: rows }, () => Array.from({ length: cols }, () => ''));\n    const raw = ['| ' + head.join(' | ') + ' |', '| ' + head.map(() => '---').join(' | ') + ' |', ...body.map((r) => '| ' + r.join(' | ') + ' |')].join('\\n');\n    await ferrum.editor.insert(formatTable(raw));\n  });\n};\n\nexports.deactivate = function () {};\n"},"README.md":{"encoding":"utf8","content":"# Markdown Tools\n\n- **Format Table** aligns the pipes of the table around the cursor and keeps the `:---:` alignment. Write a rough table, run the command, done.\n- **Insert Table** makes an empty table of the size you ask for.\n- **Insert Table of Contents** builds a nested list of links from your headings (ignoring code blocks), with GitHub style anchors.\n- **Toggle Task Checkbox** turns `- [ ]` into `- [x]` and back, and makes a plain line a task. Shortcut: Shift+Alt+X.\n- **Promote / Demote Heading** changes the level of the headings in the selection.\n- **Sort Selected List** and **Make Selection a Link**.\n\nNo permissions needed.\n"}}}