Jelly, 235 225213 bytes
“¤ßȷŒȷddðdẎeȤdƤƬddƲdƝ‘s2⁵+€⁴¤żẎṣjƭƒ“Ç=ÇgƲȷ€çfȤeƲ€fƈiÆf¿fÐɦÇÞµÞÇe2jÑصؿg8i€ØµØ½ð4Ɲ5Ɲ2fƲµÞµÞ½Ʋ;æ½f¿f½Ʋ5¤6Ʋ€g¬g½i¬ⱮvðɓȷeðɓȷeðɓȷeḳƁḳeƤııeƤııeƤııⱮp×ædɓædɓædɓd×⁾×eƝçıçeƝçıçeƝçıçd×⁾¤o‘b50U+Ø0U‘Œṙṁ1xⱮ“&ðẏṪ¶ẏ×Ṙ⁷Ƈ⁾1Ẓṁn#’b64¤¤ị““µ!æeıçȷ&#ð%ø&$dɓeñe÷Ɲ$Ƥ&ɓ'¤"' 'dd%dẎeȤdƤƬddƲdƝ‘s2⁴+Ɱ23¤żẎṣjƭƒ“Ç=ÇgƲ'€$fȤeƲ€fƈiÆf¿fÐɦÇ!×Çe2jÑþµþ¿g8i€þµþ½%4Ɲ5Ɲ2fƲ××½Ʋ;#½f¿f½Ʋ5¤6Ʋ€g¬g½i¬ⱮvØØØḳƁḳÞÞÞⱮpœßßßdœ⁾œŒŒŒdœ⁾¤o‘b50U+Ø0U‘Œṙṁ1xⱮ“&ðẏṪ¶ẏ×Ṙ⁷Ƈ⁾1Ẓṁn#’b64¤¤ị“ *#.-”Y
Uses a combination of run-length encoding and replacement of common length-2 sequences with a single digit. Does not use any standard compression library like gzip. Overall has 182169 bytes of compressed data and 4344 of code.
Step 1: replace values in the data between 17 and 2639 with prestored pairs of bytes
“¤“µ...Ɲ‘ | Base-250 integer list 39, 2133, 2622, 19101, 25, 23, 26, 38, 35, 24, 37, 29, 38, 36, 100, 155, 101, 27, 101, 28, 150, 36, 151, 38, 155, 39, 3, 34, 39, 32, 39, 100, 24100, 37, 100, 209, 101, 154, 100, 151, 152, 100, 100, 153, 100, 150
s2 | Split into twos
¤ż | Zip the following as a nilad with this:
⁵⁴ | - 1016
+€⁴+Ɱ23 | - Add 16this to implicit range from 1 to 1023
Ẏ | Tighten (join outermost lists)
ƒ“Ç...o‘ | Reduce using the following, and starting with the base-250 integer list 14, 61, 14, 103, 153, 2639, 12, 2336, 102, 154, 101, 153, 12, 102, 156, 105, 13, 102, 11, 102, 15, 160, 14, 20, 933, 2017, 14, 101, 50, 106, 16, 1831, 9, 1831, 11, 103, 56, 105, 12, 1831, 9, 1831, 10, 2437, 52, 150, 53, 150, 50, 102, 153, 9, 20, 917, 2017, 10, 153, 59, 2235, 10, 102, 11, 102, 10, 153, 53, 3, 54, 153, 12, 103, 7, 103, 10, 105, 7, 149, 118, 24, 155, 26, 101, 24, 155, 26, 101, 24, 15518, 2618, 10118, 217, 143, 217, 101, 151, 25, 25, 101, 151, 25, 25, 101, 15120, 2520, 2520, 149, 112, 17, 22, 100, 155, 22, 100, 15530, 2221, 10021, 15521, 100, 1730, 142, 17, 101, 150, 23, 25, 23, 101, 150, 23, 25, 23, 101, 15030, 2319, 2519, 2319, 100, 1730, 142, 3, 111
ƭ | - Alternate between:
ṣ | - Splitting
j | - And joining