diff --git a/docs/UniformlyConvergentExansionsForTHeType1BesselFunctionsOfEvenOrders.mw b/docs/UniformlyConvergentExansionsForTHeType1BesselFunctionsOfEvenOrders.mw index 8af679bbb..04f3ea277 100644 --- a/docs/UniformlyConvergentExansionsForTHeType1BesselFunctionsOfEvenOrders.mw +++ b/docs/UniformlyConvergentExansionsForTHeType1BesselFunctionsOfEvenOrders.mw @@ -5,7 +5,7 @@ - + @@ -148,51 +148,51 @@ -LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYjLUkjbWlHRiQ2I1EhRic= +JSFH LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYvLUkjbWlHRiQ2JVEiakYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RKiZjb2xvbmVxO0YnL0YzUSdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGPS8lKXN0cmV0Y2h5R0Y9LyUqc3ltbWV0cmljR0Y9LyUobGFyZ2VvcEdGPS8lLm1vdmFibGVsaW1pdHNHRj0vJSdhY2NlbnRHRj0vJSdsc3BhY2VHUSwwLjI3Nzc3NzhlbUYnLyUncnNwYWNlR0ZMLUkobWZlbmNlZEdGJDYkLUYjNiktRiw2JVEibkYnRi9GMi1GNjYtUSIsRidGOUY7L0Y/RjFGQEZCRkRGRkZIL0ZLUSYwLjBlbUYnL0ZOUSwwLjMzMzMzMzNlbUYnLUYsNiVRInlGJ0YvRjIvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GJy8lJXNpemVHUSMxMkYnLyUrZXhlY3V0YWJsZUdGPUY5RjktRjY2LVEoJnNyYXJyO0YnRjlGO0Y+RkBGQkZERkZGSEZlbi9GTkZmbi1GLDYlUShCZXNzZWxKRicvRjBGPUY5LUZQNiQtRiM2K0ZULUY2Ni1RIitGJ0Y5RjtGPkZARkJGREZGRkgvRktRLDAuMjIyMjIyMmVtRicvRk5GZHAtSSZtZnJhY0dGJDYoLUkjbW5HRiQ2JFEiMUYnRjktRiM2JS1GanA2JFEiMkYnRjlGL0YyLyUubGluZXRoaWNrbmVzc0dGXHEvJStkZW5vbWFsaWduR1EnY2VudGVyRicvJSludW1hbGlnbkdGZnEvJSliZXZlbGxlZEdGPUZXRmluRlxvRl9vRmJvRjlGOS1GNjYtUScmc2RvdDtGJ0Y5RjtGPkZARkJGREZGRkhGZW5GZ28tRiw2JVElc3FydEYnRltwRjktRlA2JC1GIzYnLUZncDYoLUYsNiVRI1BpRidGW3BGOS1GIzYnRl9xRltyRmluRi9GMkZicUZkcUZncUZpcUZcb0Zfb0Zib0Y5RjlGXG9GX29GYm9GOQ== -LV9JLFR5cGVzZXR0aW5nRzYkJSpwcm90ZWN0ZWRHSShfc3lzbGliRzYiSSxtcHJpbnRzbGFzaEdGKDYkNyM+SSJqR0YoZio2JEkibkdGKEkieUdGKEYoNiRJKW9wZXJhdG9yR0YoSSZhcnJvd0dGKEYoKiYtSSJKR0YoNiQsJjkkIiIiI0Y7IiIjRjs5JUY7LUklc3FydEdGJTYjLCQqJkkjUGlHRiZGO0Y+ISIiRjxGO0YoRihGKDcjRi4= +LV9JLFR5cGVzZXR0aW5nRzYkJSpwcm90ZWN0ZWRHSShfc3lzbGliRzYiSSxtcHJpbnRzbGFzaEdGKDYkNyM+SSJqR0YoZio2JEkibkdGKEkieUdGKEYoNiRJKW9wZXJhdG9yR0YoSSZhcnJvd0dGKEYoKiYtSSJKR0YoNiQsJkYwIiIiI0Y6IiIjRjpGMUY6LUklc3FydEdGJTYjLCQqKEY7RjpJI1BpR0YmRjpGMSEiIkY6RjpGKEYoRig3I0Yu -LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYjLUkjbWlHRiQ2I1EhRic= +JSFH LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYwLUkjbWlHRiQ2JVEkcHNpRicvJSdpdGFsaWNHUSZmYWxzZUYnLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGJy1JI21vR0YkNi1RKiZjb2xvbmVxO0YnRjIvJSZmZW5jZUdGMS8lKnNlcGFyYXRvckdGMS8lKXN0cmV0Y2h5R0YxLyUqc3ltbWV0cmljR0YxLyUobGFyZ2VvcEdGMS8lLm1vdmFibGVsaW1pdHNHRjEvJSdhY2NlbnRHRjEvJSdsc3BhY2VHUSwwLjI3Nzc3NzhlbUYnLyUncnNwYWNlR0ZJLUYsNiVRKHVuYXBwbHlGJy9GMFEldHJ1ZUYnL0YzUSdpdGFsaWNGJy1JKG1mZW5jZWRHRiQ2JC1GIzYsLUYsNiNRIUYnLUYjNigtRiw2JVEpc2ltcGxpZnlGJ0ZPRlEtRlQ2JC1GIzYuLUY2Ni1RIn5GJ0YyRjlGO0Y9Rj9GQUZDRkUvRkhRJjAuMGVtRicvRktGYm8tRiw2JVElc3FydEYnRi9GMi1GVDYkLUYjNilGWC1GIzYnLUkmbWZyYWNHRiQ2KC1GIzYoRlgtRlQ2JC1GIzYrLUkjbW5HRiQ2JFEiOEYnRjJGXm8tRiw2JVEibkYnRk9GUS1GNjYtUSIrRidGMkY5RjtGPUY/RkFGQ0ZFL0ZIUSwwLjIyMjIyMjJlbUYnL0ZLRmFxLUZncDYkUSIyRidGMi8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJStleGVjdXRhYmxlR0YxRjJGMkZmcUZpcUZcckYyLUYjNiUtRiw2JVEjUGlGJ0YvRjJGT0ZRLyUubGluZXRoaWNrbmVzc0dRIjFGJy8lK2Rlbm9tYWxpZ25HUSdjZW50ZXJGJy8lKW51bWFsaWduR0Zoci8lKWJldmVsbGVkR0YxRmZxRmlxRlxyRjJGWEZmcUZpcUZcckYyRjItRjY2LVEnJnNkb3Q7RidGMkY5RjtGPUY/RkFGQ0ZFRmFvRmNvLUklbXN1cEdGJDYlLUZUNiQtRiM2KC1GNjYtUSomdW1pbnVzMDtGJ0YyRjlGO0Y9Rj9GQUZDRkVGYHFGYnEtRmdwNiRGZXJGMkZmcUZpcUZcckYyRjItRiM2JUZqcEZPRlEvJTFzdXBlcnNjcmlwdHNoaWZ0R1EiMEYnRl1zLUYsNiVRImpGJ0ZPRlEtRlQ2JC1GIzYrRmNxRl5vRmpwLUY2Ni1RIixGJ0YyRjkvRjxGUEY9Rj9GQUZDRkVGYW8vRktRLDAuMzMzMzMzM2VtRictRiw2JVEieUYnRk9GUUZmcUZpcUZcckYyRjJGZnFGaXFGXHJGMkYyRmZxRmlxRlxyRjJGaHRGanBGaHRGXnVGZnFGaXFGXHJGMkYyRl5vLUY2Ni1RKWFzc3VtaW5nRidGMkY5RjtGPUY/RkFGQ0ZFRmFvRmNvRl5vRl51LUY2Ni1RIj5GJ0YyRjlGO0Y9Rj9GQUZDRkVGR0ZKLUZncDYkRmB0RjJGZnFGaXFGXHJGMg== -LV9JLFR5cGVzZXR0aW5nRzYkJSpwcm90ZWN0ZWRHSShfc3lzbGliRzYiSSxtcHJpbnRzbGFzaEdGKDYkNyM+SSRwc2lHRihmKjYkSSJuR0YoSSJ5R0YoRig2JEkpb3BlcmF0b3JHRihJJmFycm93R0YoRigqKjklIyEiIiIiIywmOSQiIiUiIiJGPSNGPUY5KUY4RjtGPS1JIkpHRig2JCwmRjtGOUY+Rj1GNkY9RihGKEYoNyNGLg== +LV9JLFR5cGVzZXR0aW5nRzYkJSpwcm90ZWN0ZWRHSShfc3lzbGliRzYiSSxtcHJpbnRzbGFzaEdGKDYkNyM+SSRwc2lHRihmKjYkSSJuR0YoSSJ5R0YoRig2JEkpb3BlcmF0b3JHRihJJmFycm93R0YoRigqKilGMSMiIiIiIiMhIiIpLCYqJiIiJUY4RjBGOEY4RjhGOEY3RjgpRjpGMEY4LUkiSkdGKDYkLCYqJkY5RjhGMEY4RjhGN0Y4RjFGOEYoRihGKDcjRi4= -JSFH +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYjLUkjbWlHRiQ2I1EhRic= LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYsLUkjbWlHRiQ2JVEkZXRhRicvJSdpdGFsaWNHUSZmYWxzZUYnLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGJy1JI21vR0YkNi1RIn5GJ0YyLyUmZmVuY2VHRjEvJSpzZXBhcmF0b3JHRjEvJSlzdHJldGNoeUdGMS8lKnN5bW1ldHJpY0dGMS8lKGxhcmdlb3BHRjEvJS5tb3ZhYmxlbGltaXRzR0YxLyUnYWNjZW50R0YxLyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdGSS1GNjYtUSomY29sb25lcTtGJ0YyRjlGO0Y9Rj9GQUZDRkUvRkhRLDAuMjc3Nzc3OGVtRicvRktGUC1GLDYlUSh1bmFwcGx5RicvRjBRJXRydWVGJy9GM1EnaXRhbGljRictSShtZmVuY2VkR0YkNiQtRiM2LC1GLDYlUSlzaW1wbGlmeUYnRlVGVy1GWjYkLUYjNigtRiw2JVEkaW50RidGVUZXLUZaNiQtRiM2MS1GLDYlUShCZXNzZWxKRidGL0YyLUZaNiQtRiM2KS1GLDYlUSJtRidGVUZXLUY2Ni1RIixGJ0YyRjkvRjxGVkY9Rj9GQUZDRkVGRy9GS1EsMC4zMzMzMzMzZW1GJy1GLDYlUSJ4RidGVUZXLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lK2V4ZWN1dGFibGVHRjFGMkYyLUY2Ni1RJyZzZG90O0YnRjJGOUY7Rj1GP0ZBRkNGRUZHRkotRiw2JVEkcHNpRidGL0YyLUZaNiQtRiM2KS1GLDYlUSJrRidGVUZXRmBwRmZwRmlwRlxxRl9xRjJGMkZgcEZmcC1GNjYtUSI9RidGMkY5RjtGPUY/RkFGQ0ZFRk9GUS1JI21uR0YkNiRRIjBGJ0YyLUY2Ni1RIy4uRidGMkY5RjtGPUY/RkFGQ0ZFL0ZIUSwwLjIyMjIyMjJlbUYnRkotRiw2JVEpaW5maW5pdHlGJ0YvRjJGaXBGXHFGX3FGMkYyRmlwRlxxRl9xRjJGMkZgcEZdcEZgcEZbckZpcEZccUZfcUYyRjItRjY2LVEiO0YnRjJGOUZjcEY9Rj9GQUZDRkVGR0ZRRmlwRlxxRl9xRjI= -LV9JLFR5cGVzZXR0aW5nRzYkJSpwcm90ZWN0ZWRHSShfc3lzbGliRzYiSSxtcHJpbnRzbGFzaEdGKDYkNyM+SSRldGFHRihmKjYkSSJtR0YoSSJrR0YoRig2JEkpb3BlcmF0b3JHRihJJmFycm93R0YoRigsJCoyLCY5JSIiJSIiIkY6I0Y6IiIjKSEiIkY4RjpJI1BpR0YmRjtGPEY7LUkmR0FNTUFHRiU2IywoOSRGO0Y4RjpGO0Y6RjotRkE2IywoRjhGPkZERjtGO0Y6Rj4tRkE2IywoRjhGOkY6RjpGRCNGPkY8Rj4tRkE2IywoRkRGO0Y4RjpGOkY6Rj5GO0YoRihGKDcjRi4= +LV9JLFR5cGVzZXR0aW5nRzYkJSpwcm90ZWN0ZWRHSShfc3lzbGliRzYiSSxtcHJpbnRzbGFzaEdGKDYkNyM+SSRldGFHRihmKjYkSSJtR0YoSSJrR0YoRig2JEkpb3BlcmF0b3JHRihJJmFycm93R0YoRigsJCo0IyIiIiIiI0Y4KSwmKiYiIiVGOEYxRjhGOEY4RjhGN0Y4KSEiIkYxRjgpSSNQaUdGJkY3RjgpRjlGN0Y4LUkmR0FNTUFHRiU2IywoKiZGN0Y4RjBGOEY4RjFGOEY3RjhGOC1GRDYjLChGMUY/RkdGOEY3RjhGPy1GRDYjLChGMUY4RjhGOEZHRj9GPy1GRDYjLChGR0Y4RjFGOEY4RjhGP0Y4RihGKEYoNyNGLg== LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2JVEkZXRhRicvJSdpdGFsaWNHUSZmYWxzZUYnLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGJy1JKG1mZW5jZWRHRiQ2JC1GIzYpLUkjbW5HRiQ2JFEiMEYnRjItSSNtb0dGJDYtUSIsRidGMi8lJmZlbmNlR0YxLyUqc2VwYXJhdG9yR1EldHJ1ZUYnLyUpc3RyZXRjaHlHRjEvJSpzeW1tZXRyaWNHRjEvJShsYXJnZW9wR0YxLyUubW92YWJsZWxpbWl0c0dGMS8lJ2FjY2VudEdGMS8lJ2xzcGFjZUdRJjAuMGVtRicvJSdyc3BhY2VHUSwwLjMzMzMzMzNlbUYnLUYsNiVRImtGJy9GMEZGL0YzUSdpdGFsaWNGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJStleGVjdXRhYmxlR0YxRjJGMkZnbkZqbkZdb0Yy -LCQqMCwmSSJrRzYiIiIlIiIiRigjRigiIiMpISIiRiVGKEkjUGlHJSpwcm90ZWN0ZWRHRilGKkYpLUkmR0FNTUFHNiRGLkkoX3N5c2xpYkdGJjYjLCZGJUYoRilGKEYoLUYwNiMsJkYlRixGKUYoRiwtRjA2IywmRiVGKEYoRighIiNGKQ== +LCQqMiMiIiIiIiNGJSksJiomIiIlRiVJImtHNiJGJUYlRiVGJUYkRiUpISIiRitGJSlJI1BpRyUqcHJvdGVjdGVkR0YkRiUpRiZGJEYlLUkmR0FNTUFHNiRGMUkoX3N5c2xpYkdGLDYjLCZGK0YlRiRGJUYlLUY0NiMsJkYrRi5GJEYlRi4pLUY0NiMsJkYrRiVGJUYlRiZGLkYl LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYsLUkjbWlHRiQ2JVEkaG1tRicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUkjbW9HRiQ2LVEqJmNvbG9uZXE7RicvRjNRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0Y9LyUpc3RyZXRjaHlHRj0vJSpzeW1tZXRyaWNHRj0vJShsYXJnZW9wR0Y9LyUubW92YWJsZWxpbWl0c0dGPS8lJ2FjY2VudEdGPS8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRkwtSShtZmVuY2VkR0YkNiQtRiM2KS1GLDYlUSJ4RidGL0YyLUY2Ni1RIixGJ0Y5RjsvRj9GMUZARkJGREZGRkgvRktRJjAuMGVtRicvRk5RLDAuMzMzMzMzM2VtRictRiw2JVEiTkYnRi9GMi8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJStleGVjdXRhYmxlR0Y9RjlGOS1GNjYtUSgmc3JhcnI7RidGOUY7Rj5GQEZCRkRGRkZIRmVuL0ZORmZuLUYsNiVRJHN1bUYnRi9GMi1GUDYkLUYjNjItRiw2JVEoQmVzc2VsSkYnL0YwRj1GOS1GUDYkLUYjNiktRiw2JVEia0YnRi9GMkZXRlRGXG9GX29GYm9GOUY5LUY2Ni1RJyZzZG90O0YnRjlGO0Y+RkBGQkZERkZGSEZlbkZnby1GLDYlUSRldGFGJ0ZicEY5LUZQNiQtRiM2KS1JI21uR0YkNiRRIjBGJ0Y5RldGZ3BGXG9GX29GYm9GOUY5RldGZ3AtRjY2LVEiPUYnRjlGO0Y+RkBGQkZERkZGSEZKRk0tRjY2LVEqJnVtaW51czA7RidGOUY7Rj5GQEZCRkRGRkZIL0ZLUSwwLjIyMjIyMjJlbUYnL0ZORl9yRmluLUY2Ni1RIy4uRidGOUY7Rj5GQEZCRkRGRkZIRl5yRmdvRmluRlxvRl9vRmJvRjlGOUZcb0Zfb0Zib0Y5 -LV9JLFR5cGVzZXR0aW5nRzYkJSpwcm90ZWN0ZWRHSShfc3lzbGliRzYiSSxtcHJpbnRzbGFzaEdGKDYkNyM+SSRobW1HRihmKjYkSSJ4R0YoSSJOR0YoRig2JEkpb3BlcmF0b3JHRihJJmFycm93R0YoRigtSSRzdW1HRiU2JComLUkiSkdGKDYkSSJrR0YoOSQiIiItSSRldGFHRig2JCIiIUY8Rj4vRjw7LCQ5JSEiIkZGRihGKEYoNyNGLg== +LV9JLFR5cGVzZXR0aW5nRzYkJSpwcm90ZWN0ZWRHSShfc3lzbGliRzYiSSxtcHJpbnRzbGFzaEdGKDYkNyM+SSRobW1HRihmKjYkSSJ4R0YoSSJOR0YoRig2JEkpb3BlcmF0b3JHRihJJmFycm93R0YoRigtSSRzdW1HRiU2JComLUkiSkdGKDYkSSJrR0YoRjAiIiItSSRldGFHRig2JCIiIUY8Rj0vRjw7LCRGMSEiIkYxRihGKEYoNyNGLg== LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2JVEkaW50RicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUkobWZlbmNlZEdGJDYkLUYjNi4tRiw2JVEkaG1tRidGL0YyLUY2NiQtRiM2KS1GLDYlUSJ4RidGL0YyLUkjbW9HRiQ2LVEiLEYnL0YzUSdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGMS8lKXN0cmV0Y2h5R0ZMLyUqc3ltbWV0cmljR0ZMLyUobGFyZ2VvcEdGTC8lLm1vdmFibGVsaW1pdHNHRkwvJSdhY2NlbnRHRkwvJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR1EsMC4zMzMzMzMzZW1GJy1JI21uR0YkNiRRIzEwRidGSC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJStleGVjdXRhYmxlR0ZMRkhGSEZERkEtRkU2LVEiPUYnRkhGSi9GTkZMRk9GUUZTRlVGVy9GWlEsMC4yNzc3Nzc4ZW1GJy9GZ25Gam8tRmpuNiRRIjBGJ0ZILUZFNi1RIy4uRidGSEZKRmhvRk9GUUZTRlVGVy9GWlEsMC4yMjIyMjIyZW1GJy9GZ25GZW4tRmpuNiRRJDEwMEYnRkhGXW9GYG9GY29GSEZIRl1vRmBvRmNvRkg= -LF5vKioiIiMjIiIiRiRJI1BpRyUqcHJvdGVjdGVkR0YlIiIoRiUiIiRGJSMiJXBSIidzNTgqKEYkRiVGJ0YlLUkiSkc2IjYkIiIhIiQrIkYmIiNdKigiIiZGJUYnRiVGJEYlI0YmIiIpKigiIzhGJUYnRiVGJEYlIyIjRCIkNyYqKCIjSEYlRidGJUYkRiUjIidUUz0iKDMnKVEpKigiI1BGJUYnRiVGJEYlIyIqRFN1WiIiKyNmTSoqZSkqLkYkRiVGJyNGKkYkIiM2RiUtRjA2JEY5RjRGJi1JJ1dlYmVyRUc2JEYoSShfc3lzbGliR0YxNiRGKUY0RiZGKkYlIyErRDFCTjUiK0M9dXQ1Ki5GJEYlRidGSkZLRiUtRjBGUkYmLUZPRk1GJkYqRiUjIitEMUJONUZVKipGJEYlRidGSi1GMDYkRiZGNEYmLUZPNiRGJEY0RiYjIiR2JyIjayoqRiRGJUYnRkotRjA2JEY3RjRGJi1GTzYkIiInRjRGJiMiKEQsbiciKHcmWzUqKkYkRiVGJ0ZKRi9GJi1JKFN0cnV2ZUhHRlBGZ25GJiEjRCoqRiRGJUYnRkotRjBGaW5GJi1GaG82JCEiIkY0RiYjISR2J0ZcbyoqRiRGJUYnRkotRjBGYW9GJi1GT0Zfb0YmIyEoRCxuJ0ZlbyoqRjdGJUYnRiVGJEYlRi9GJiNGXnBGOSoqRjtGJUYnRiVGJEYlRi9GJiNGaW9GPioqRjtGJUYnRiVGJEYlRltwRiYjRmlvIiRjIyoqRkBGJUYnRiVGJEYlRi9GJiMhJ1RTPUZDKipGQEYlRidGJUYkRiVGW3BGJiNGX3EiKC9WPiUqKkZARiVGJ0YlRiRGJS1GMDYkIiIlRjRGJkZhcSoqRkBGJUYnRiVGJEYlRmJwRiZGYXEqKkZFRiVGJ0YlRiRGJUYvRiYjISpEU3VaIkZIKipGRUYlRidGJUYkRiVGW3BGJiNGanEiKydIblxIJSoqRkVGJUYnRiVGJEYlRmRxRiZGXHIqKkZFRiVGJ0YlRiRGJUZicEYmRlxyKipGRUYlRidGJUYkRiVGTEYmRlxyKipGJEYlRidGSkZmbkYmLUZob0YyRiZGPSosRiRGJUYnRkoiIzxGJUZkcUYmLUZPNiRGKkY0RiYjISZEMSQiJiVROyosRiRGJUYnRkoiI1RGJS1GMDYkIiM1RjRGJi1GTzYkIiIqRjRGJiMhLERJZk5MJiIsT25aPihvKixGJEYlRidGJUYpRiVGKkYlRi9GJiMhJXBSRi0qLEYkRiVGJ0YlRilGJUYqRiVGW3BGJiNGZ3MiJk9iJyosRiRGJUYnRiVGKUYlRipGJUZkcUYmRmlzKixGJEYlRidGSkZkckYlLUYwRmZyRiYtRk9GZXFGJiMiJkQxJEZpciosRiRGJUYnRkpGW3NGJS1GMEZgc0YmLUZPRl1zRiYjIixESWZOTCZGZHM= +LF5vKiwjIiVwUiInczU4IiIiKSIiIyNGJ0YpRicpSSNQaUclKnByb3RlY3RlZEdGKkYnKSIiKEYqRicpIiIkRipGJ0YnKioiI11GJ0YoRidGK0YnLUkiSkc2IjYkIiIhIiQrIkYnRicqKiNGJyIiKUYnKSIiJkYqRidGK0YnRihGJ0YnKiojIiNEIiQ3JkYnKSIjOEYqRidGK0YnRihGJ0YnKiojIidUUz0iKDMnKVEpRicpIiNIRipGJ0YrRidGKEYnRicqKiMiKkRTdVoiIisjZk0qKmUpRicpIiNQRipGJ0YrRidGKEYnRicqMCMiK0QxQk41IitDPXV0NUYnRihGJylGLCNGMUYpRicpIiM2RipGJy1GNTYkRjxGOUYnLUknV2ViZXJFRzYkRi1JKF9zeXNsaWJHRjY2JEYvRjlGJ0YwRichIiIqMEZSRidGKEYnRlVGJ0ZXRictRjVGaW5GJy1GZm5GWkYnRjBGJ0YnKiwjIiR2JyIja0YnRihGJ0ZVRictRjU2JEYnRjlGJy1GZm42JEYpRjlGJ0YnKiwjIihELG4nIih3Jls1RidGKEYnRlVGJy1GNTYkRj5GOUYnLUZmbjYkIiInRjlGJ0YnKixGQUYnRihGJ0ZVRidGNEYnLUkoU3RydXZlSEdGZ25GY29GJ0ZqbiosRl9vRidGKEYnRlVGJy1GNUZlb0YnLUZhcDYkRmpuRjlGJ0ZqbiosRmdvRidGKEYnRlVGJy1GNUZdcEYnLUZmbkZbcEYnRmpuKixGO0YnRj1GJ0YrRidGKEYnRjRGJ0ZqbiosRkBGJ0ZDRidGK0YnRihGJ0Y0RidGam4qLCNGQSIkYyNGJ0ZDRidGK0YnRihGJ0ZjcEYnRmpuKixGRkYnRklGJ0YrRidGKEYnRjRGJ0ZqbiosI0ZHIigvVj4lRidGSUYnRitGJ0YoRidGY3BGJ0ZqbiosRmBxRidGSUYnRitGJ0YoRictRjU2JCIiJUY5RidGam4qLEZgcUYnRklGJ0YrRidGKEYnRmdwRidGam4qLEZMRidGT0YnRitGJ0YoRidGNEYnRmpuKiwjRk0iKydIblxIJUYnRk9GJ0YrRidGKEYnRmNwRidGam4qLEZpcUYnRk9GJ0YrRidGKEYnRmNxRidGam4qLEZpcUYnRk9GJ0YrRidGKEYnRmdwRidGam4qLEZpcUYnRk9GJ0YrRidGKEYnRllGJ0ZqbiosRkFGJ0YoRidGVUYnRmJvRictRmFwRjdGJ0YnKi4jIiZEMSQiJiVRO0YnRihGJ0ZVRicpIiM8RipGJ0ZjcUYnLUZmbjYkRjFGOUYnRmpuKi4jIixESWZOTCYiLE9uWj4ob0YnRihGJ0ZVRicpIiNURipGJy1GNTYkIiM1RjlGJy1GZm42JCIiKkY5RidGam4qLkYkRidGKEYnRitGJ0YuRidGMEYnRjRGJ0ZqbiouI0YlIiZPYidGJ0YoRidGK0YnRi5GJ0YwRidGY3BGJ0ZqbiouRmZzRidGKEYnRitGJ0YuRidGMEYnRmNxRidGam4qLkZhckYnRihGJ0ZVRidGZHJGJy1GNUZnckYnLUZmbkZkcUYnRicqLkZpckYnRihGJ0ZVRidGXHNGJy1GNUZic0YnLUZmbkZfc0YnRic= @@ -204,13 +204,13 @@ LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2JVEmZXZhbGZGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSShtZmVuY2VkR0YkNiQtRiM2KC1GLDYlUSRobW1GJ0YvRjItRjY2JC1GIzYnLUkjbW5HRiQ2JFEkMi4zRicvRjNRJ25vcm1hbEYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lK2V4ZWN1dGFibGVHUSZmYWxzZUYnRkVGRUZHRkpGTUZFRkVGR0ZKRk1GRQ== -XiQkIis/PHVLeCEjNSQiIiFGJw== +LCYkIis/PHVLeCEjNSIiIiomJCIiIUYpRiZeI0YmRiZGJg== LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2JVEmZXZhbGZGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSShtZmVuY2VkR0YkNiQtRiM2KC1GLDYlUSRobW1GJ0YvRjItRjY2JC1GIzYnLUkjbW5HRiQ2JFElMC4wMUYnL0YzUSdub3JtYWxGJy8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJStleGVjdXRhYmxlR1EmZmFsc2VGJ0ZFRkVGR0ZKRk1GRUZFRkdGSkZNRkU= -XiQkIispXCN6YzchIiokIiIhRic= +LCYkIispXCN6YzchIioiIiIqJiQiIiFGKUYmXiNGJkYmRiY= @@ -260,7 +260,7 @@ -JSFH +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYjLUkjbWlHRiQ2I1EhRic= @@ -600,7 +600,7 @@ LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2JVElcGxvdEYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JKG1mZW5jZWRHRiQ2JC1GIzYyLUY2NiYtRiM2Ky1GLDYlUSJKRidGL0YyLUY2NiQtRiM2KS1JI21uR0YkNiRRIjFGJy9GM1Enbm9ybWFsRictSSNtb0dGJDYtUSIsRidGSS8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGMS8lKXN0cmV0Y2h5R0ZRLyUqc3ltbWV0cmljR0ZRLyUobGFyZ2VvcEdGUS8lLm1vdmFibGVsaW1pdHNHRlEvJSdhY2NlbnRHRlEvJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR1EsMC4zMzMzMzMzZW1GJy1GLDYlUSJ4RidGL0YyLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lK2V4ZWN1dGFibGVHRlFGSUZJRkstRjY2JC1GIzYoLUYsNiVRIktGJ0YvRjItRjY2JC1GIzYrRkVGSy1GRjYkUSMyMEYnRklGS0Zeb0Zhb0Zkb0Znb0ZJRklGYW9GZG9GZ29GSUZJLUYsNiNRIUYnRmFvRmRvRmdvRklGSS8lJW9wZW5HUSJbRicvJSZjbG9zZUdRIl1GJ0ZLRl5vLUZMNi1RIj1GJ0ZJRk8vRlNGUUZURlZGWEZaRmZuL0ZpblEsMC4yNzc3Nzc4ZW1GJy9GXG9GZXEtRkw2LVEqJnVtaW51czA7RidGSUZPRmNxRlRGVkZYRlpGZm4vRmluUSwwLjIyMjIyMjJlbUYnL0Zcb0Zbci1GRjYkUSMxMEYnRkktRkw2LVEjLi5GJ0ZJRk9GY3FGVEZWRlhGWkZmbkZqcS9GXG9Gam5GZHBGSy1GLDYlUSdsZWdlbmRGJ0YvRjJGYHEtRjY2Ji1GIzYrRmdwLUkjbXNHRiQ2I0ZARkstRlxzNiNGX3BGZ3BGYW9GZG9GZ29GSUZJRmpwRl1xRmFvRmRvRmdvRklGSUZhb0Zkb0Znb0ZJ -NistJSdDVVJWRVNHNiU3XVxsNyQkISQrIiEiIiQhMVdoKW9odXNNJSEjPDckJCEwQlkjXD1GVSkqISM5JCExYSY0bXAiUmMjKSEjPDckJCExOktrR00uMCgqISM6JCEyKUhyayh6MFk6IiEjPDckJCExJnljOFolcF0mKiEjOiQhMnVsbHEkPSwvOiEjPDckJCExI1F3X1hLYFIqISM6JCEyJ1J0KylcZGEjPSEjPDckJCExJHBReCUpMzJDKiEjOiQhMll4R3BBIz0yQCEjPDckJCExZjxOcUhOKDQqISM6JCExTSU0XikqKip6SyMhIzs3JCQhMDI5R0U7KlsqKSEjOSQhMiZ6a20uajs1RCEjPDckJCEwcFB2IUdTJnopISM5JCEyLj8xLF0kKlFrIyEjPDckJCExI1wpcFJBKik9KCkhIzokITEjZjh0PC0mKW8jISM7NyQkITEnSGY9biJRVScpISM6JCExJDQtIjM+InpyIyEjOzckJCExemU8NTkuLicpISM6JCExL2JlRSE9cXMjISM7NyQkITFpQ1xbNm9qJikhIzokITEsakkqRyIqPnQjISM7NyQkITFYITRvKTNMQyYpISM6JCExQzZIQ2QhR3QjISM7NyQkITFHYzdEMSlcWykhIzokITJ4JHBxUTlXSEYhIzw3JCQhMUxsSWg2bTolKSEjOiQhMmF2J1xAQEo4RiEjPDckJCExUHVbKHBUak0pISM6JCEyYVxxb1BaVG8jISM8NyQkITEpWyhcKlIvJG8jKSEjOiQhMT5aMCN5ZWRqIyEjOzckJCExUHZdLHJFIT4pISM6JCEyPGw/U2pGNWQjISM8NyQkITExN0NbO2JMISkhIzokITJGJT07KHkyRlIjISM8NyQkITFlPE5xc18jKXkhIzokITJ5ZU40OEBCOyMhIzw3JCQhMXJUJG9tI1FYeCEjOiQhMUxeelFbdTE+ISM7NyQkITEzPE1vV0kjZSghIzokITJQX1IoUj0uXjohIzw3JCQhMDM7SyVlOld1ISM5JCExdSMpUU1mSDY3ISM7NyQkITFjN0RdaFgkRyghIzokITBEJWVIXksoeighIzs3JCQhMTZCWSNwNDc5KCEjOiQhMicqSFl1KUc7RlAhIz03JCQhMSczPE15VV4pcCEjOiQiMGNIdjInPWIiKiEjPDckJCExJilwUnosYE9vISM6JCIxYnVidGs0OmEhIzw3JCQhMVJ6ZTwmbzlvJyEjOiQiMiN6R2krJil6MzUhIzw3JCQhMXdeLjJOMlJsISM6JCIyKD5eWyI9X25VIiEjPDckJCExIkdjN0QiWyZRJyEjOiQiMkFrbzMmeW5iPSEjPDckJCExJzQ+UTFVZkEnISM6JCIyR3Mzc2Fja0UjISM8NyQkITEvMztLRjEoMychIzokIjF6N1V4PCRvZSMhIzs3JCQhMUppQ1wjcHEkZiEjOiQiMiZcTi85QSplKUchIzw3JCQhMThFXy84NiN5JiEjOiQiMSM+S2pDSWU4JCEjOzckJCExdFkkcD06MGomISM6JCIyMU9IbUteYUokISM8NyQkITAlemVubTxkYiEjOSQiMjlNYFAmPWd4TCEjPDckJCExMTdDWyJRUVsmISM6JCIyKGYkcHdaISpHVSQhIzw3JCQhMWU6Sig9QkpXJiEjOiQiMS1dWDEnKmVTTSEjOzckJCEwIj5RRSMzQ1MmISM5JCIyO0lHbm0hKkdYJCEjPDckJCExJjM8ZnVdP1EmISM6JCIxbGcoeiYpKSpwWCQhIzs3JCQhMWhBWGxLcGhgISM6JCIyT2tveCNvdGZNISM8NyQkITFQdSlceU44TSYhIzokIjE5J0hFcCk0aE0hIzs3JCQhMThFXy8keTRLJiEjOiQiMlkhUVZqIXo1WSQhIzw3JCQhMSJHYzc1JVIlRyYhIzokIjJFWzpEVWN2WCQhIzw3JCQhMCYqKil6Kik0eUMmISM5JCIxcEJnJlFLJlxNISM7NyQkITE9T3MlcEQ3QCYhIzokIjJicjNDKnkpcFYkISM8NyQkITEoR2Q5XFRZPCYhIzokIjIkUVB5Jz00Kj5NISM8NyQkISknPWw0JiEiKCQiMSI9QWxwRiNvTCEjOzckJCExOEZhM2RSPV0hIzokIjJ3InopUS1SZUgkISM8NyQkITFqRWAxUSJvKFshIzokIjFXS0BmJD1CNiQhIzs3JCQhMXVaJjRSRj9zJSEjOiQiMldBemlAKEhPRyEjPDckJCExPE1vT2FRd1ghIzokIjFBO2ArTSV6XSMhIzs3JCQhMVUjWydIdzlDVyEjOiQiMmQuZWR3NiYpNCMhIzw3JCQhMW9PdFl0SXZVISM6JCIydVIpW0ZoKCpROyEjPDckJCExMztLa2BbPlQhIzokIjI2KkckUTMtSzUiISM8NyQkITJWKW9Qdi1UcFIhIzskIjEmPVU1UWhGViYhIzw3JCQhMUdiNUBvJGYiUSEjOiQhMSNlRSFSQC5raiEjPTckJCExOEVfL1V0ak8hIzokITEtSzklcDV5KW8hIzw3JCQhMXdeLjJlKFFfJCEjOiQhMXpwTGddanQ3ISM7NyQkITJGXi0wSSNlakwhIzskITJ1R3pVRkJRJT4hIzw3JCQhMU5wUXhRQD9LISM6JCExWXo+MDQpPmAjISM7NyQkITEjUnljQmB0MSQhIzokITIyP091UGthOCQhIzw3JCQhMlkjXClwNFk1I0ghIzskITI6NXMiM0VPek8hIzw3JCQhMWAwNkEzZmVGISM6JCExIltMQmFAQUIlISM7NyQkITF1WiY0XDt6aCMhIzokITJZVjRaJVsjemwlISM8NyQkITFyVCRvJylcI2VDISM6JCExN1ZPVjZOcl0hIzs3JCQhMTQ9T3M1dDdCISM6JCEwNmloekBjUCYhIzo3JCQhMCwtL1FjTjojISM5JCExS10kekVlO2kmISM7NyQkITFrRmJnZilbMyMhIzokITFlY2YsXz4pcCYhIzs3JCQhMnVeLjJhOmksIyEjOyQhMV53KikpKnpFY2QhIzs3JCQhMj1Pc1d1NnIoPiEjOyQhMWpxK0pVJjR5JiEjOzckJCExMTdDW3orUT4hIzokITFqeGhzLlwqeiYhIzs3JCQhMi4wNT86LyopKj0hIzskITBGZzMoPSQ9ImUhIzo3JCQhMlgqKXlkTispZj0hIzskITFmMzMleVR6ImUhIzs3JCQhMSc9UHU9OTQlPSEjOiQhMUAmUVA0Xyc9ZSEjOzckJCEydVomND4hRz8jPSEjOyQhMWJXbCY+Kip5ImUhIzs3JCQhMipvUHZdPTkuPSEjOyQhMTo6KHkmM286ZSEjOzckJCEyLjE3Q29iVXkiISM7JCEwXmYzRiYqPiJlISM6NyQkITJMa0dkTSRbWTwhIzskITFUIylIR3NAK2UhIzs3JCQhMmlBWCE0NXIzPCEjOyQhMVk4UHEhZkR5JiEjOzckJCEyJ0hmPShvOktqIiEjOyQhMTdKayVvYSdIZCEjOzckJCEyS2pFYE8/eGIiISM7JCExciYqXDQmZUxsJiEjOzckJCEyTnNXKik9JkcyOSEjOyQhMVUzQWJ3WUthISM7NyQkITJ2XCoqKXpTd2k3ISM7JCExPiFHM1tJaTgmISM7NyQkITI7TW9PJEhgMTYhIzskITIuciMqNEQmKnpzJSEjPDckJCExemQ6SktMdyYqISM7JCExTFwnNEJqKWZVISM7NyQkITE9T3NXXEI0ISkhIzskITFCPyNSInAoPnAkISM7NyQkITEuMjlHT2ohZichIzskITFbYWsqeS8nPkohIzs3JCQhMSwtLzNPIkctJiEjOyQhMm83PmFxTklWIyEjPDckJCEyJ3lkOkpfNkBOISM8JCEvT1IxTVRMPCEjOTckJCEyUXZdLC5zSS0jISM8JCEyemx3Jyl5cGorIiEjPDckJCExRV4tMDVnJGUlISM8JCExUjVMKW8pPiJIIyEjPDckJCIxT3JVJjNueiMpKiEjPCQiMi8pcFF1SDAzXCEjPTckJCIyOklnP1RRKGVDISM8JCIyOShwJSpcRDU/NyEjPDckJCIyJ3ljOEZNTikzJSEjPCQiMnJ1Q2xhajwrIyEjPDckJCIxVSYzPE1PUWMmISM7JCIybVtkVVhdY24jISM8NyQkIjF1WyhcKlJ6c3EhIzskIjFlSzsvZCMpPkwhIzs3JCQiMTI6SWddTzInKSEjOyQiMkM9NXFTU3MiUiEjPDckJCIyJz1QdVtNeiw1ISM7JCIxR19zcz5MMVchIzs3JCQiMnhhND5lYkA6IiEjOyQiMTQ2ZXolNGomWyEjOzckJCIyJz1QdVtKUCw4ISM7JCIxPV9ZOydIS0EmISM7NyQkIjIuMjlHYyopNFkiISM7JCIxJVJYKikzVDxfJiEjOzckJCIyPU1vTzhXPWciISM7JCIxNDZYITQjeStkISM7NyQkIjJfLTA1Zy1KbyIhIzskIjFLJ1FyIkhDbmQhIzs3JCQiMiczPE1vNU9rPCEjOyQiMTBcJSk0WF8xZSEjOzckJCIxQFUlUVckcCN5IiEjOiQiMWJhdGBZaTZlISM7NyQkIjJQdFkkPmUtLD0hIzskIjFiIVtmJDRNOmUhIzs3JCQiMmpDXFs+ZSQ+PSEjOyQiMWo5ZCdldXciZSEjOzckJCIyKWU8TnEwcFA9ISM7JCIxeT5kNnNpPWUhIzs3JCQiMjlGYWUlSC1jPSEjOyQiMTg4MCN6KyM9ZSEjOzckJCIyUXljOEtiVig9ISM7JCIxdGhSJG8oUjtlISM7NyQkIjJsSGZvcChvIyo9ISM7JCIxUSk+Vmg/SyJlISM7NyQkIjIjND1PcystNj4hIzskIjEqMyd6Jm9zJzNlISM7NyQkIjI6SGU7eXZOKT4hIzskIjE8WUtya0h4ZCEjOzckJCIxdVomNFxKaDAjISM6JCIxJSpcNHkseUNkISM7NyQkIjJiMzxNKUc8N0EhIzskIjE5OFQvVS1VYiEjOzckJCIxKFF4YVxYKW9CISM6JCIxczZGNk8kcEUmISM7NyQkIjIlZj1QdVZSNkQhIzskIjEnXGZtUmxEJVwhIzs3JCQiMlF6ZTwmXHhpRSEjOyQiMVRranNoL0dYISM7NyQkIil3XTVHISIoJCIwQ2RyKEg5aVMhIzo3JCQiMUppQ1w4bHFIISM6JCIxeEhRU11JKlwkISM7NyQkIjFGYTM8LUE0SiEjOiQiMWRsaXE4RnRIISM7NyQkIjJ0WyhcKmZyJG9LISM7JCIxKUhYZ3EiR09CISM7NyQkIjJkOUhlRSMpelQkISM7JCIyWFAxKyF5Pzw8ISM8NyQkIjEyOUdjeTltTiEjOiQiMk9vOSR6TVInNCIhIzw3JCQiMVJ5Yzg4VjlQISM6JCIxZWUoXGhAcHklISM8NyQkIjJWJSlvUDByYydRISM7JCEyYT9MZDAvPE8iISM9NyQkIjE9T3NXRSlmLSUhIzokITBEVjxJWHplKCEjOzckJCIxJilvUHZFKEg8JSEjOiQhMShRaj5EXUdIIiEjOzckJCIxXi0wNTIyPVYhIzokITJDXk9sQypldzwhIzw3JCQiMUZiNUAieUpaJSEjOiQhMm08Ils1PFNQQSEjPDckJCIxQVcpbyh5JXppJSEjOiQhMXYoPlYvVDpqIyEjOzckJCIwND1PI0gnb3clISM5JCEyPCZReksvPENIISM8NyQkIjFfLjI5eVRKXCEjOiQhMihHIlJHdUQ1PiQhIzw3JCQiMiYqKXlkOig0InBdISM7JCExaycqXChHJj1YTCEjOzckJCIxKnBSenlLJ1xeISM6JCExaiFmemI/Y1MkISM7NyQkIjEyOklnZTpJXyEjOiQhMXNdJCpwVS9XTSEjOzckJCIxYzZCJ2YiZW9fISM6JCEyWGBDJ0c9a2FNISM8NyQkIjEvMztLdCsyYCEjOiQhMVZOMmdPRWdNISM7NyQkIjFHYzcrLUFFYCEjOiQhMmpHIjNpa0BoTSEjPDckJCIxXy80b0lWWGAhIzokITElSCpwcmEkNFkkISM7NyQkIjF3XzBPZmtrYCEjOiQhMkVmaHMqW1VmTSEjPDckJCIvLC0vKWVRUSYhIzgkITJPIyopPlQkKm9jTSEjPDckJCIxMztLOSF5Q1gmISM6JCEyODhcSVUpKnBWJCEjPDckJCIxO0ppQ3M0QGIhIzokITIkenNUPiM9P1MkISM8NyQkIjFLakUubkUpZiYhIzokITF6dGBOZyNbTSQhIzs3JCQiMVomND49T2FuJiEjOiQhMiVRX15MWEZwSyEjPDckJCIyJlwqKil6Pil6SWUhIzskIS8iM0NfOlUxJCEjOTckJCIxUXdfMD1VJilmISM6JCEyO1RUSVFxX3ojISM8NyQkIjF0WCJIb3goR2ghIzokITJfWSMzXVJvJVwjISM8NyQkIjI6RV8vUjlzRichIzskITInRyo0J1FqJypRQCEjPDckJCIxVydHZCV5c0lrISM6JCExW2tndXVFSzwhIzs3JCQiMU9xUyIpKltQZSchIzokITJpOlc0OTR0SCIhIzw3JCQiMS4yOUcrOlRuISM6JCExcm4pRyY+JSkpSCkhIzw3JCQiMSYqKXlkJiopeXpvISM6JCEyYXY9Wih6My5UISM9NyQkIjElemU8YmplLighIzokIjFsUC87a0F3ZyEjPTckJCIyYjdEXSt6RD4oISM7JCIxOmgwTFs2Pl8hIzw3JCQiMXRYIkhRLk9NKCEjOiQiMUVGUTpXel8lKiEjPDckJCIxaEBWJyl6dSFbKCEjOiQiMWZQakhgUC84ISM7NyQkIjFCWSNcPUVRayghIzokIjFNb0FMQlMicCIhIzs3JCQiMV4tMDVbKD55KCEjOiQiMmtENSRvWC56PiEjPDckJCIxdl0sLlhuVXohIzokIjJ3Nj83akMyRSMhIzw3JCQiMC0vMyc0I1wzKSEjOSQiMnczNGd6XCJlQyEjPDckJCIxWSNcKXB5KTRDKSEjOiQiMSdSVWs9XFxoIyEjOzckJCIxJ0hmPTwlSDokKSEjOiQiMSNmNnQ8a29tIyEjOzckJCIxWiRwUVorJypRKSEjOiQiMT53bHVqKFFxIyEjOzckJCIxMztLKillT0clKSEjOiQiMVYxPVpRQzxGISM7NyQkIjFwUXgvODhuJSkhIzokIjFtW2lGUWBFRiEjOzckJCIxSmhBP24qZV0pISM6JCIxZSU+SyM0dkpGISM7NyQkIjEjUnljOGlZYSkhIzokIjJtUDROZDBIdCMhIzw3JCQiMSNlOyQpKTNFIWUpISM6JCIxc3RzIlwsL3QjISM7NyQkIjF1WiY0a2ZlaCkhIzokIjFqeExNP11DRiEjOzckJCIxa0hmJFJlOWwpISM6JCIxOiRRQzVHX3IjISM7NyQkIjFjNkJZcjAobykhIzokIjExaGU4WWctRiEjOzckJCIxLjE3dUsmUXcpISM6JCIxYWg0d3A1a0UhIzs3JCQiMV4rLC0lXDElKSkhIzokIjJgayUzJSlHXjVFISM8NyQkIjFPc1cqZSk9KyEqISM6JCIyd3BWPDEnKkdYIyEjPDckJCIxRmI1QHoxUiIqISM6JCIyX18zYnZ5IW9BISM8NyQkIjEsLC0vOTEqRyohIzokIjBLZScqUU1PLSMhIzo3JCQiMHNWKFskPlNXKiEjOSQiMTxISVdaXEc8ISM7NyQkIjFlO0xtYWgmZiohIzokIjE3M1dTcS4wOSEjOzckJCIxRF4tMERIVSgqISM6JCIyckNhTXQ2bjEiISM8NyQkIjBzVihbQjowKiohIzkkIjByTz53TyY0biEjOzckJCIyWCE0PTsqW14rIiEjOiQiMjlKJ0gwRXdjSSEjPTckJCIyPk9zV1x0Mi0iISM6JCExbHFBY2ViUyYpISM9NyQkIjJvT3RZb0pcLiIhIzokITJXWyQ+dyxLSlYhIz03JCQiMmU6SmlLNS8wIiEjOiQhMHRPSmpRKnl6ISM7NyQkIjI6SGU7X3VcMSIhIzokITIiKSk0SW5qQj42ISM8NyQkIjE0PU8tJCk+ITMiISM5JCEyTGdbKHA1VkQ5ISM8NyQkIjJrRWAxTCMzJjQiISM6JCEyXy9oSl0yJCpvIiEjPDckJCIyQ1olKilHWG01NiEjOiQhMkJQW1FvV0EjPiEjPDckJCIyWiUqKXlQP25ENiEjOiQhMkNfKT5pYj4rQCEjPDckJCIyLzM7S1E+NTkiISM6JCEybC9hZi4mZkpBISM8NyQkIjJpQVhTXkgnWzYhIzokITIoUjx3VSQ+cUYjISM8NyQkIjFzVihba1JpOiIhIzkkITJQP0ZjKmU1NEIhIzw3JCQiMnliNls1TyhmNiEjOiQhMjxkTiVmcU0+QiEjPDckJCIyUXVbWmNLSzsiISM6JCExVCIqKXpgWm5LIyEjOzckJCIyKEhmb0MhSG47IiEjOiQhMUtaY1dvSUpCISM7NyQkIjJjNkJZW0QtPCIhIzokITI8Q0RdKXktTEIhIzw3JCQiMkBWJ0dBR0J1NiEjOiQhMnQzZUwuPTpMIyEjPDckJCIyKVsoXCpmLEN5NiEjOiQhMk49XE88LmpLIyEjPDckJCIyYDE4d1xaQT0iISM6JCEyOTZvOydSUzxCISM8NyQkIjI9UXdfJFtEJz0iISM6JCEyaWdkWndZW0kjISM8NyQkIjIzO0trREJNPiIhIzokITJ6KFsmRzxrTEYjISM8NyQkIjIoUnpleDtmKzchIzokITI3OSp6Ino0MEIjISM8NyQkIjElemU8dXhlQCIhIzkkITJ2Jz1dNjBfLUAhIzw3JCQiMjM5R2NYMzBCIiEjOiQhMkc9QSMpR0doJD4hIzw3JCQiMXliNiQpUnZZNyEjOSQhMk5EXy15MGdxIiEjPDckJCIyZTpKaVRAM0UiISM6JCEybj9iaSE+MHQ5ISM8NyQkIjE7S2t5ISl5dzchIzkkITJKJSlcVEc9czwiISM8NyQkIjJCWCE0ZSpSOEgiISM6JCExUGkkPSRSQ1spKSEjPDckJCIxS2tHRnVEMjghIzkkITFNWS03czB5YSEjPDckJCIyOkdjN14iKjRLIiEjOiQhMUYvdVNMdSpbIyEjPDckJCIyUHVbKEhJak84ISM6JCIxVyJcKGUyI0dIKiEjPTckJCIyMDZBVyc+dV44ISM6JCIyd3l2KEhCcHRUISM9NyQkIjIpcFJ6RzUlb08iISM6JCIxXnlHUCM0Z0coISM8NyQkIjIzO0trYSUpPVEiISM6JCIyUVpGXjcmKSo9NSEjPDckJCIyTW9PdGxPalIiISM6JCIyO0QoeUZnaHQ3ISM8NyQkIjEqemY+eGY+VCIhIzkkIjJOSDA7JSlHaV4iISM8NyQkIjJgMjpJdFxvVSIhIzokIjJ2VkZESUU1ciIhIzw3JCQiMShSemVyP0RXIiEjOSQiMmxxTTFdNkwoPSEjPDckJCIyaEFYIUhucWM5ISM6JCIyJSplJFw8KCllej4hIzw3JCQiMidHZDlIZWFrOSEjOiQiMmlPNytKYTUtIyEjPDckJCIyN0JZI0hcUXM5ISM6JCIyYSF5OTxnKCpcPyEjPDckJCIyQlcpPXYiUmhaIiEjOiQiMjlWXyhHKVwkZj8hIzw3JCQiMktsSTZVJCopejkhIzokIjJrcmBPajllMSMhIzw3JCQiMlcnRzJud2skWyIhIzokIjJWQmQjRyhvJHA/ISM8NyQkIjJgMjpJIj5TKFsiISM6JCIyO2UkKVJYOSsyIyEjPDckJCIxKWU8NS1aNlwiISM5JCIycyo+eCI+bngxIyEjPDckJCIyMDU/IUhAKltcIiEjOiQiMnYqRz9cQmtpPyEjPDckJCIxOEUtUHNqKVwiISM5JCIxXGA4JT1hWTAjISM7NyQkIjJkN0RdTSNRLTohIzokIjE2U2V3MyNRLyMhIzs3JCQiMm9PdFkhZj81OiEjOiQiMiMpcFsyKD02Nz8hIzw3JCQiMiIzO0trJUghPTohIzokIjFDWWA+R01vPiEjOzckJCIyLjE3Qy5UQ2AiISM6JCIwdCwvKTNIZD0hIzo3JCQiMmlCWiVcLz9aOiEjOiQiMiRcJyl5T1o1MDwhIzw3JCQiMioqKXpmKmYnXGo6ISM6JCIyM1lgYCRlQidcIiEjPDckJCIyJz1QdUc5RHk6ISM6JCIyYmUubGpGXEYiISM8NyQkIjI9UXdfK1RMZiIhIzokIjJBPnkhKSlIT0E1ISM8NyQkIjFbJ0hmcidvMzshIzkkIjEvJSlbKkhdT1coISM8NyQkIjEwNT81Q3pBOyEjOSQiMTsybDpWJ3B2JSEjPDckJCIyeWU8TmlHeWoiISM6JCIxKG9BZzRtbiI9ISM8NyQkIjEwNT8hUV1GbCIhIzkkITJ2TFw4XFtbNiIhIz03JCQiMC8zOy03KG87ISM4JCExcCgpPSJRaEY+JSEjPDckJCIydlkkcHl1eiNvIiEjOiQhMUM6MmApZiIqeichIzw3JCQiMS8zO3MiXCEqcCIhIzkkITFCW2tuJUcuaCohIzw3JCQiMTlHY3Ndcjg8ISM5JCEySCIpZSFHTC8iPiIhIzw3JCQiMjI2QVdARSNHPCEjOiQhMldueSUpb048UiIhIzw3JCQiMjxNb09OSVF1IiEjOiQhMTtHaSpHeEpkIiEjOzckJCIxc1YoW2goXGY8ISM5JCEyTUMsZDJmYnIiISM8NyQkIjIjPlF3LUR2dDwhIzokITIoUWhtb2MkeSE9ISM8NyQkIjJkO0w7YEA4eSIhIzokITFYMEdXQSE9JT0hIzs3JCQiMkVeLTBjISopKXkiISM6JCEydnYlZjJPOGw9ISM8NyQkIjJGYTNuKFFlI3oiISM6JCEyX0l0RmNHRSg9ISM8NyQkIjJHZDlIPnhpeiIhIzokITJBREtTZGt2KD0hIzw3JCQiMS4xNzQwKCoqeiIhIzkkITJ5RThtPVMqej0hIzw3JCQiMktqRWAjUW0uPSEjOiQhMiYqSHlbU2Qoej0hIzw3JCQiMlslKil5NzVuNj0hIzokITJpJVI4IilmZ3E9ISM8NyQkIjJqRF4tP3knPj0hIzokITIxeS9ydnEmXD0hIzw3JCQiMmlAVk9rMW0jPSEjOiQhMWwrMiJcPz4jPSEjOzckJCIxd14uKDNOTiQ9ISM5JCEyM2c+MUV2Y3kiISM8NyQkIjEjUXdfQV0lXD0hIzkkITEjWyYzIVxcNW4iISM7NyQkIjJ4YTQ+SDZXJz0hIzokITEpcD5GKCl6ZV8iISM7NyQkIjF1WiY0JnlBej0hIzkkITFUQHZeXSgpXDghIzs3JCQiMTxNbyc+Y1MqPSEjOSQhMjhcMlkoKSpwWDYhIzw3JCQiMnheLjI8IT00PiEjOiQhMWh5QUclKilSOCohIzw3JCQiMSYqKil6SDhARD4hIzkkITFRUmh5LXdtayEjPDckJCIyPUtrR0w1KlI+ISM6JCExI1JpLEk2VCpRISM8NyQkIjFlO0xPLFVhPiEjOSQhMncqKWVAPVU6SCIhIz03JCQiMmU9UHUoMyQqcD4hIzokIjJLandxOTZ4XCIhIz03JCQiMmIyOkkmeVMmKT4hIzokIjEob1N4KFJfQlUhIzw3JCQiJCsjISIiJCIxMF1lPENKJG8nISM8LSUnTEVHRU5ERzYjLSUpX1RZUEVTRVRHNiMtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliRzYiNjYtSSNtc0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkc2IjYjUSJKNiIvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW42Ii8lJXNpemVHUSMxMjYiLyUlYm9sZEdRJmZhbHNlNiIvJSdpdGFsaWNHUSZmYWxzZTYiLyUqdW5kZXJsaW5lR1EmZmFsc2U2Ii8lLnN0cmlrZXRocm91Z2hHUSZmYWxzZTYiLyUqc3Vic2NyaXB0R1EmZmFsc2U2Ii8lLHN1cGVyc2NyaXB0R1EmZmFsc2U2Ii8lK2ZvcmVncm91bmRHUShbMCwwLDBdNiIvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XTYiLyUnb3BhcXVlR1EmZmFsc2U2Ii8lK2V4ZWN1dGFibGVHUSZmYWxzZTYiLyUpcmVhZG9ubHlHUSZmYWxzZTYiLyUpY29tcG9zZWRHUSZmYWxzZTYiLyUqY29udmVydGVkR1EmZmFsc2U2Ii8lK2ltc2VsZWN0ZWRHUSZmYWxzZTYiLyUscGxhY2Vob2xkZXJHUSZmYWxzZTYiLyU2c2VsZWN0aW9uLXBsYWNlaG9sZGVyR1EmZmFsc2U2Ii8lLG1hdGh2YXJpYW50R1Enbm9ybWFsNiItJSZDT0xPUkc2JyUkUkdCRyQiKUMpZXElISIpJCIiISEiIiQiKCc+IVwmISIpLSUrX0FUVFJJQlVURUc2Iy8lJ3NvdXJjZUclLG1hdGhkZWZhdWx0Ry0lJ0NVUlZFU0c2JTdkeTckJCEkKyIhIiIkITEkXHZ4JmZNak0hIzw3JCQhMEJZI1w9RlUpKiEjOSQhMWI/NTJabkFFISM8NyQkITE6S2tHTS4wKCohIzokITI7InBuKCpvVDk9ISM9NyQkITEmeWM4WiVwXSYqISM6JCExPGolXCdSL3IkKSEjPTckJCExI1F3X1hLYFIqISM6JCIxZDhkOVUiXCo+ISM9NyQkITEkcFF4JSkzMkMqISM6JCIxIlxQNSN5JjRFIiEjPDckJCExZjxOcUhOKDQqISM6JCIyV0NcRDRfMEQjISM9NyQkITAyOUdFOypbKikhIzkkIjIvWV8/ZkMqZUshIz03JCQhMHBQdiFHUyZ6KSEjOSQiMXUkMyQ0OmpnVSEjPDckJCExJ0hmPW4iUVUnKSEjOiQiMiY9bDxhJ29JPiYhIz03JCQhMUdjN0QxKVxbKSEjOiQiMSQqPlRsQThlZyEjPDckJCExUHVbKHBUak0pISM6JCIxXiJRIlwtYEBuISM8NyQkITFQdl0sckUhPikhIzokIjElR1tMYilcUHQhIzw3JCQhMTE3Q1s7YkwhKSEjOiQiMURCeWMwNCh6KCEjPDckJCExI1snSGYlUiFleiEjOiQiMUJvVyhvTWsmeiEjPDckJCExZTxOcXNfIyl5ISM6JCIxOGtSKGVdSTIpISM8NyQkITFsSGZvXCZSInkhIzokIjEiXEx1PSFwUyIpISM8NyQkITFyVCRvbSNRWHghIzokIjElcC4nZlsjNDwpISM8NyQkITFSemVuTiVRbSghIzokIjEjKVx4bjY0ZCIpISM8NyQkITEzPE1vV0kjZSghIzokIjE8NS5fTzwpMykhIzw3JCQhMSYqKXlkOklLXighIzokIjEpUUIhW0g4Jyl6ISM8NyQkITAzO0slZTpXdSEjOSQiMSR6ekpQY1AleSEjPDckJCExYzdEXWhYJEcoISM6JCIxUXU5X0tFY3QhIzw3JCQhMTZCWSNwNDc5KCEjOiQiMUUjWyMpNGdXdSchIzw3JCQhMSczPE15VV4pcCEjOiQiMV9qdSc0eFwpZSEjPDckJCExJilwUnosYE9vISM6JCIxLyEpZm9oIVEqWyEjPDckJCExUnplPCZvOW8nISM6JCIyJltAKilcNU8mcCQhIz03JCQhMXdeLjJOMlJsISM6JCIxTHRZc084a0MhIzw3JCQhMSJHYzdEIlsmUSchIzokIjJuPic0LUM0PTUhIz03JCQhMSc0PlExVWZBJyEjOiQhMUNkWDBPM11lISM9NyQkITEvMztLRjEoMychIzokITJpXTZzeVAhUT8hIz03JCQhMUppQ1wjcHEkZiEjOiQhME1bJD1OblBPISM7NyQkITE4RV8vODYjeSYhIzokITE6bj1ibiMqKUcmISM8NyQkITF0WSRwPTowaiYhIzokITF6OllFJDRtJ28hIzw3JCQhMTE3Q1siUVFbJiEjOiQhMEpfdyZ6XkEkKSEjOzckJCExOEVfLyR5NEsmISM6JCExKFskZUtTPzspKiEjPDckJCExKEdkOVxUWTwmISM6JCEyc0JWKnk+Oiw2ISM8NyQkITE4RmEzZFI9XSEjOiQhMkYlKip6IXBSJzQ3ISM8NyQkITFqRWAxUSJvKFshIzokITE0ZVpUWXooRyIhIzs3JCQhMXVaJjRSRj9zJSEjOiQhMT0oUi8qKkciWzghIzs3JCQhMSc0PlFUMSNcWSEjOiQhMSYzLVtAd2xPIiEjOzckJCExPE1vT2FRd1ghIzokITBXV2BrXiN5OCEjOjckJCExQlkjXClmS1FYISM6JCEyLyllZTxtYyJRIiEjPDckJCEwJGU7TGxFK1ghIzkkITE0KkgoXCg+SFEiISM7NyQkITFOcVMiMzJBWSUhIzokITIjRyNlSCRmRiNRIiEjPDckJCExVSNbJ0h3OUNXISM6JCEyTmM1NyE9Z3o4ISM8NyQkITFiND4pW0YoXFYhIzokITJbSnRGKHlRbzghIzw3JCQhMW9PdFl0SXZVISM6JCEyJnA9S2ZsMlw4ISM8NyQkITFRd19ialIoPiUhIzokITIyTVFYJyl6Kj44ISM8NyQkITEzO0trYFs+VCEjOiQhMlB6YDtzQTtHIiEjPDckJCEyVilvUHYtVHBSISM7JCEyemwkcGQrOSI9IiEjPDckJCExR2I1QG8kZiJRISM6JCEyc3EiMyZHdDsvIiEjPDckJCExOEVfL1V0ak8hIzokITFlXko4Iyo9bScpISM8NyQkITF3Xi4yZShRXyQhIzokITFRU2E3JClIUm4hIzw3JCQhMkZeLTBJI2VqTCEjOyQhMSwjcGtmUXI7JSEjPDckJCExTnBReFFAP0shIzokITJRRy82XitGYiIhIz03JCQhMSNSeWNCYHQxJCEjOiQiMmoiXCU+VCwlUjohIz03JCQhMlkjXClwNFk1I0ghIzskIjJrNUp0Y3N4dyUhIz03JCQhMWAwNkEzZmVGISM6JCIxSzJpVkNIQycpISM8NyQkITF1WiY0XDt6aCMhIzokIjIvSC1zNmBnQCIhIzw3JCQhMXJUJG8nKVwjZUMhIzokIjJDKSkqXGpcN047ISM8NyQkITE0PU9zNXQ3QiEjOiQiMjowelVIcCJIPyEjPDckJCEwLC0vUWNOOiMhIzkkIjImUWZoR05Ab0MhIzw3JCQhMnVeLjJhOmksIyEjOyQiMlk9PCVvPVVcRyEjPDckJCEyWCopeWROKylmPSEjOyQiMVdHJypRVDQiRyQhIzs3JCQhMmlBWCE0NXIzPCEjOyQiMVwob1BsYS5wJCEjOzckJCEyS2pFYE8/eGIiISM7JCIyVl5hO3Y9bDMlISM8NyQkITJOc1cqKT0mRzI5ISM7JCIxcCEqPS5gU2pXISM7NyQkITJ2XCoqKXpTd2k3ISM7JCIxdFJdVGc9L1shIzs3JCQhMjtNb08kSGAxNiEjOyQiMXNnXikpeUlXXiEjOzckJCExemQ6SktMdyYqISM7JCIwInknZiIpPm9WJiEjOjckJCExPU9zV1xCNCEpISM7JCIxcjZ3XnoxMmQhIzs3JCQhMS4yOUdPaiFmJyEjOyQiMSZmRzo6SF8iZiEjOzckJCExLC0vM08iRy0mISM7JCIwalUtIilwPTUnISM6NyQkITIneWQ6Sl82QE4hIzwkIjFmRUpvN1lOaSEjOzckJCExbUtsSU80c0YhIzskIjFkYUg+YChcRychIzs3JCQhMlF2XSwuc0ktIyEjPCQiMTpdR0ouJ0dLJyEjOzckJCEyTXBReC8lKj1qIiEjPCQiMT0ib289enpMJyEjOzckJCEyS2pFYDE7MkMiISM8JCIxdi4/K3EoKVxqISM7NyQkITFHZDlIM1EmXCkhIzwkIjE3ayxgR2FlaiEjOzckJCExRV4tMDVnJGUlISM8JCIwKTNYInpvUk8nISM6NyQkITEuMTdDKSozMikqISM9JCIxMG0xdmM0bWohIzs3JCQiMl8rLC0vJD1BRSEjPSQiMU0yMSo+b2FPJyEjOzckJCIxclMiRzF2XUEnISM8JCIxYjk1X28zaWohIzs3JCQiMU9yVSYzbnojKSohIzwkIjFWQ1ZuVSZmTichIzs3JCQiMnVdLC5jbjJzIiEjPCQiMXVTZCVlRVtMJyEjOzckJCIyOklnP1RRKGVDISM8JCIwREZIcVpBSSchIzo3JCQiMid5YzhGTU4pMyUhIzwkIjF5I0cjPWlLIT4nISM7NyQkIjFVJjM8TU9RYyYhIzskIjFiW05GISl5VWchIzs3JCQiMXVbKFwqUnpzcSEjOyQiMUFnaU01YVtlISM7NyQkIjEyOklnXU8yJykhIzskIjBXPW8pUXMzYyEjOjckJCIyJz1QdVtNeiw1ISM7JCIxIjNmRWtITk4mISM7NyQkIjJ4YTQ+ZWJAOiIhIzskIjE5cicpKnArJFtdISM7NyQkIjInPVB1W0pQLDghIzskIjEsTlxJL1Y6WiEjOzckJCIyLjI5R2MqKTRZIiEjOyQiMjxqKVszQkBKViEjPDckJCIyPU1vTzhXPWciISM7JCIxTSopUSVbeEIoUiEjOzckJCIyJzM8TW81T2s8ISM7JCIyJT5EVmtGJDNhJCEjPDckJCIyIzQ9T3MrLTY+ISM7JCIxWFluTyJlLjkkISM7NyQkIjF1WiY0XEpoMCMhIzokIjFSaiZmM1snUUYhIzs3JCQiMmIzPE0pRzw3QSEjOyQiMi5UZ09oMGZJIyEjPDckJCIxKFF4YVxYKW9CISM6JCIyVmQiR1daOHc9ISM8NyQkIjIlZj1QdVZSNkQhIzskIjInZmVlJD5XUVwiISM8NyQkIjJRemU8Jlx4aUUhIzskIjIlZXNsKHk+OjUiISM8NyQkIil3XTVHISIoJCIxSFolKiopNEdqdCEjPDckJCIxSmlDXDhscUghIzokIjBfc0A2NWJrJCEjOzckJCIxRmEzPC1BNEohIzokIjF0dHQpKjM8Rm0hIz03JCQiMnRbKFwqZnIkb0shIzskITAib1VEXiJHWSMhIzs3JCQiMmQ5SGVFIyl6VCQhIzskITJYKFxQOCxqIzMmISM9NyQkIjEyOUdjeTltTiEjOiQhMXo5IXlXN01OKCEjPDckJCIxUnljODhWOVAhIzokITF1QU89ZXMqRyohIzw3JCQiMlYlKW9QMHJjJ1EhIzskITIlPiQ0IikzXjQ0IiEjPDckJCIxPU9zV0UpZi0lISM6JCEyZCdRb09PO0I3ISM8NyQkIjEmKW9QdkUoSDwlISM6JCEyeEJgQWZmKjM4ISM8NyQkIjJ2YzhGcEBiQyUhIzskITF3czUrYi5SOCEjOzckJCIxXi0wNTIyPVYhIzokITE9NT0yVzxoOCEjOzckJCIwMjlHY1pvTiUhIzkkITJlKFxWX3khKXA4ISM8NyQkIjEqKXlkOldpJlIlISM6JCEyI0giZmxwWmlQIiEjPDckJCIxMzxNbzdTTVchIzokITJaUFclelFfIVEiISM8NyQkIjFGYjVAInlKWiUhIzokITJpREMoZiRvRVEiISM8NyQkIjI7RF0rY3E9XiUhIzskITJOV3VgQDxGUSIhIzw3JCQiMXZcKiopKkhjXVghIzokITE4ditESXIhUSIhIzs3JCQiMSlwUnpWYiMqZSUhIzokITJaJGUhNEMkcHc4ISM8NyQkIjFBVylvKHklemklISM6JCExb2MoXDUocHE4ISM7NyQkIjFjN0QrYVMocCUhIzokITIvcmhTPTFeTiIhIzw3JCQiMDQ9TyNIJ293JSEjOSQhMS5GaWEqSE5MIiEjOzckJCIxXy4yOXlUSlwhIzokITI8VS81ai8sRSIhIzw3JCQiMiYqKXlkOig0InBdISM7JCEybkt3Rk4+bzwiISM8NyQkIjEyOklnZTpJXyEjOiQhMmtJKDQzaG1kNSEjPDckJCIvLC0vKWVRUSYhIzgkITEnKVE3U1xkZCMqISM8NyQkIjE7SmlDczRAYiEjOiQhMWkkUiRvUDtoeiEjPDckJCIxWiY0Pj1PYW4mISM6JCExaUZVWls/MGshIzw3JCQiMiZcKiopej4pekllISM7JCEydz1YdToyRHglISM9NyQkIjFRd18wPVUmKWYhIzokITFHX3lSMVo/SiEjPDckJCIxdFgiSG94KEdoISM6JCEyOT4qcHdlXyhmIiEjPTckJCIyOkVfL1I5c0YnISM7JCExc2khSDdBYjAnISM+NyQkIjFXJ0dkJXlzSWshIzokIjI6SE1YV0VgWCIhIz03JCQiMU9xUyIpKltQZSchIzokIjIueVBMI3p2aUchIz03JCQiMS4yOUcrOlRuISM6JCIxZXd2J1E+YDwlISM8NyQkIjEmKil5ZCYqKXl6byEjOiQiMigpZk5AL1EqKT4mISM9NyQkIjElemU8YmplLighIzokIjJOWT5ZTz9gPSchIz03JCQiMmI3RF0rekQ+KCEjOyQiMXlARFVLbCUpcCEjPDckJCIxdFgiSFEuT00oISM6JCIxZDArWFNEa3YhIzw3JCQiMWhAVicpenUhWyghIzokIjBWZ29DOVUjeiEjOzckJCIxI1J5YzMoR2l2ISM6JCIxJ1EtKnA3dWkhKSEjPDckJCIxQlkjXD1FUWsoISM6JCIxRWxGU3pJWCIpISM8NyQkIjFQdVsoXCtIcighIzokIjF3O2JnUSY+PCkhIzw3JCQiMV4tMDVbKD55KCEjOiQiMWopKlIhbyhcZiIpISM8NyQkIjFqRWBjWUtpeSEjOiQiMXRGbzw7Im80KSEjPDckJCIxdl0sLlhuVXohIzokIjE9MnMmb3dPKXohIzw3JCQiMC0vMyc0I1wzKSEjOSQiLzhjNXQ2bHchIzo3JCQiMVkjXClweSk0QykhIzokIjEnR2M4KT1zYHIhIzw3JCQiMVokcFFaKycqUSkhIzokIjFiSVpIaFxEbCEjPDckJCIxI1J5YzhpWWEpISM6JCIxb1MvJkdQSHUmISM8NyQkIjFjNkJZcjAobykhIzokIjJsOjghKm8lM0hcISM9NyQkIjFeKywtJVwxJSkpISM6JCIydVgnb1VLPXJSISM9NyQkIjFPc1cqZSk9KyEqISM6JCIyPFhWSFNsUSJIISM9NyQkIjFGYjVAejFSIiohIzokIi9WLic9bEsnPiEjOjckJCIxLCwtLzkxKkcqISM6JCIxNyo+YSUpPUZGKiEjPTckJCIwc1YoWyQ+U1cqISM5JCEyJ1FlI3BzeXBIIiEjPjckJCIxZTtMbWFoJmYqISM6JCExKilSVm5RIno3IiEjPDckJCIxRF4tMERIVSgqISM6JCEyI1woZSU0SjlTPyEjPTckJCIwc1YoW0I6MCoqISM5JCEyOi0mb2M8MXFIISM9NyQkIjJYITQ9OypbXisiISM6JCExLjJSeSFbWHIkISM8NyQkIjI+T3NXXHQyLSIhIzokITFRYXo1Qz4qUiUhIzw3JCQiMm9PdFlvSlwuIiEjOiQhMTJDWkJjJzMiXCEjPDckJCIyZTpKaUs1LzAiISM6JCEyRFB2PShHTFZgISM9NyQkIjI6SGU7X3VcMSIhIzokITEqeXkoUW0oUWkmISM8NyQkIjIuMDU/VCdlczUhIzokITE2RHlLZno/ZCEjPDckJCIxND1PLSQpPiEzIiEjOSQhMmsyXyJvPlgkeSYhIz03JCQiMnhgMmxKU3czIiEjOiQhMk5HJUhpZXE2ZSEjPTckJCIya0VgMUwjMyY0IiEjOiQhMlhmT2AjPmkyZSEjPTckJCIyJXBReEhNKEc1IiEjOiQhMUB0ODQwP3BkISM8NyQkIjJDWiUqKUdYbTU2ISM6JCEyMSEqZSxpaGxwJiEjPTckJCIyWiUqKXlQP25ENiEjOiQhMVdWKkgnUXJqYSEjPDckJCIyLzM7S1E+NTkiISM6JCExQWFfOTNsMV4hIzw3JCQiMXNWKFtrUmk6IiEjOSQhMmxJcUpDJClbayUhIz03JCQiMmM2QllbRC08IiEjOiQhMiY9JHA9cVp0OCUhIz03JCQiMj1Rd18kW0QnPSIhIzokITF1N3kzYSVIWiQhIzw3JCQiMihSemV4O2YrNyEjOiQhMVZYVVosbz1HISM8NyQkIjElemU8dXhlQCIhIzkkITFCJVxxejRiMiMhIzw3JCQiMjM5R2NYMzBCIiEjOiQhMjEhb00hKipva0wiISM9NyQkIjF5YjYkKVJ2WTchIzkkITEmKTNeK1NJUV0hIz03JCQiMmU6SmlUQDNFIiEjOiQiMmpqWkRFbkA2IyEjPjckJCIxO0treSEpeXc3ISM5JCIxWyhlPkRYJ3oqKiEjPTckJCIyQlghNGUqUjhIIiEjOiQiMid6PU1mNXB3OyEjPTckJCIxS2tHRnVEMjghIzkkIjIlZUBBMmxAaEIhIz03JCQiMjpHYzdeIio0SyIhIzokIjJVZyEpR2FAPCpHISM9NyQkIjJQdVsoSElqTzghIzokIjA+Ilt0UGA7TSEjOzckJCIyMDZBVyc+dV44ISM6JCIxYnAmKipwYFAkUSEjPDckJCIyKXBSekc1JW9PIiEjOiQiMU0/Iz5CKD1iVCEjPDckJCIyMztLa2ElKT1RIiEjOiQiMXcleWdxYWFQJSEjPDckJCIyTW9PdGxPalIiISM6JCIwczlrNkcwXCUhIzs3JCQiMSp6Zj54Zj5UIiEjOSQiMUciNCxAciEzWCEjPDckJCIyYDI6SXRcb1UiISM6JCIwbyVweFBIQlchIzs3JCQiMShSemVyP0RXIiEjOSQiMVI9XUYuVkpVISM8NyQkIjJoQVghSG5xYzkhIzokIjBGLkd5L0UoUiEjOzckJCIyN0JZI0hcUXM5ISM6JCIxImZsUnVEMmckISM8NyQkIjJgMjpJIj5TKFsiISM6JCIyO0BWO3JzKHBKISM9NyQkIjJkN0RdTSNRLTohIzokIjInNF9mJzNtIXlFISM9NyQkIjIiMztLayVIIT06ISM6JCIxYCs6T2hpNkAhIzw3JCQiMi4xN0MuVENgIiEjOiQiMjhzKTNdb2dhOiEjPTckJCIyaUJaJVwvP1o6ISM6JCIxY2lNWiZcIT4nKiEjPTckJCIyKiopemYqZidcajohIzokIjI4WyNHYjtrcEghIz43JCQiMic9UHVHOUR5OiEjOiQhMiQpUkxELCNRL0khIz43JCQiMj1Rd18rVExmIiEjOiQhMThjUCJRPzskKikhIz03JCQiMVsnSGZyJ28zOyEjOSQhMiRwRiUqKjNaUVkiISM9NyQkIjEwNT81Q3pBOyEjOSQhMnYmPSFmRUEiXD4hIz03JCQiMnllPE5pR3lqIiEjOiQhMU9dSTcvdTlDISM8NyQkIjEwNT8hUV1GbCIhIzkkIS9ieS4hel0iRyEjOjckJCIwLzM7LTcobzshIzgkITInW0tPV2BlbUohIz03JCQiMnZZJHB5dXojbyIhIzokITJPUl4iKlsjPjBNISM9NyQkIjEvMztzIlwhKnAiISM5JCEyJypIb01mNkJmJCEjPTckJCIxOUdjc11yODwhIzkkITEnRyE9QnFteE8hIzw3JCQiMjI2QVdARSNHPCEjOiQhMUImZVFQUE9vJCEjPDckJCIyPE1vT05JUXUiISM6JCExOHI+K01ML08hIzw3JCQiMXNWKFtoKFxmPCEjOSQhMkReY1pDJ3pRTSEjPTckJCIyIz5Rdy1EdnQ8ISM6JCEyJ2VtIW83KSp6QCQhIz03JCQiMkVeLTBjISopKXkiISM6JCEyMiJvRic0PG0iSCEjPTckJCIyS2pFYCNRbS49ISM6JCEyTSdlKCpIIUdOYyMhIz03JCQiMmpEXi0/eSc+PSEjOiQhMmRTVmMqKnpcNyMhIz03JCQiMXdeLigzTk4kPSEjOSQhMEZuKmZCczI8ISM7NyQkIjEjUXdfQV0lXD0hIzkkITJOJD09aURsJz4iISM9NyQkIjJ4YTQ+SDZXJz0hIzokITEmUjZJXyF6bHAhIz03JCQiMXVaJjQmeUF6PSEjOSQhMi0qKmYiZnFJUj4hIz43JCQiMTxNbyc+Y1MqPSEjOSQiMi9MaUFyQ1kwJCEjPjckJCIyeF4uMjwhPTQ+ISM6JCIxKEdmOjtmKikqeiEjPTckJCIxJioqKXpIOEBEPiEjOSQiMi8heVcjKVxcJkgiISM9NyQkIjI9S2tHTDUqUj4hIzokIjJYKyVHXlkuOTwhIz03JCQiMWU7TE8sVWE+ISM5JCIxR1ZERjsxJjMjISM8NyQkIjJlPVB1KDMkKnA+ISM6JCIyJUd1a1ZdUEZDISM9NyQkIjJiMjpJJnlTJik+ISM6JCIxQ0NaITN6ZnEjISM8NyQkIiQrIyEiIiQiMU05XikpXCpmIUghIzwtJSdMRUdFTkRHNiMtJSlfVFlQRVNFVEc2Iy1JJW1yb3dHNiMvSSttb2R1bGVuYW1lRzYiSSxUeXBlc2V0dGluZ0dJKF9zeXNsaWJHNiI2Ni1JI21zRzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliRzYiNiNRIks2Ii8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbjYiLyUlc2l6ZUdRIzEyNiIvJSVib2xkR1EmZmFsc2U2Ii8lJ2l0YWxpY0dRJmZhbHNlNiIvJSp1bmRlcmxpbmVHUSZmYWxzZTYiLyUuc3RyaWtldGhyb3VnaEdRJmZhbHNlNiIvJSpzdWJzY3JpcHRHUSZmYWxzZTYiLyUsc3VwZXJzY3JpcHRHUSZmYWxzZTYiLyUrZm9yZWdyb3VuZEdRKFswLDAsMF02Ii8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdNiIvJSdvcGFxdWVHUSZmYWxzZTYiLyUrZXhlY3V0YWJsZUdRJmZhbHNlNiIvJSlyZWFkb25seUdRJmZhbHNlNiIvJSljb21wb3NlZEdRJmZhbHNlNiIvJSpjb252ZXJ0ZWRHUSZmYWxzZTYiLyUraW1zZWxlY3RlZEdRJmZhbHNlNiIvJSxwbGFjZWhvbGRlckdRJmZhbHNlNiIvJTZzZWxlY3Rpb24tcGxhY2Vob2xkZXJHUSZmYWxzZTYiLyUsbWF0aHZhcmlhbnRHUSdub3JtYWw2Ii0lJkNPTE9SRzYnJSRSR0JHJCIiISEiIiQiKCc+IVwmISIpJCIpQyllcSUhIiktJStfQVRUUklCVVRFRzYjLyUnc291cmNlRyUsbWF0aGRlZmF1bHRHLSUlVklFV0c2JDskISQrIiEiIiQiJCsjISIiJShERUZBVUxURy0mJSZfQVhJU0c2IyIiIjYmLSUmQ09MT1JHNiYlJFJHQkckIiIhISIiJCIiISEiIiQiIiEhIiItJSpMSU5FU1RZTEVHNiMiIiEtJSpUSElDS05FU1NHNiMiIiEtJS1UUkFOU1BBUkVOQ1lHNiMkIiIhISIiLSYlJl9BWElTRzYjIiIjNiYtJSZDT0xPUkc2JiUkUkdCRyQiIiEhIiIkIiIhISIiJCIiISEiIi0lKkxJTkVTVFlMRUc2IyIiIS0lKlRISUNLTkVTU0c2IyIiIS0lLVRSQU5TUEFSRU5DWUc2IyQiIiEhIiItJStBWEVTTEFCRUxTRzYkLUkjbWlHNiMvSSttb2R1bGVuYW1lRzYiSSxUeXBlc2V0dGluZ0dJKF9zeXNsaWJHNiI2NlEieDYiLyUnZmFtaWx5R1EhNiIvJSVzaXplR1EjMTA2Ii8lJWJvbGRHUSZmYWxzZTYiLyUnaXRhbGljR1EldHJ1ZTYiLyUqdW5kZXJsaW5lR1EmZmFsc2U2Ii8lLnN0cmlrZXRocm91Z2hHUSZmYWxzZTYiLyUqc3Vic2NyaXB0R1EmZmFsc2U2Ii8lLHN1cGVyc2NyaXB0R1EmZmFsc2U2Ii8lK2ZvcmVncm91bmRHUShbMCwwLDBdNiIvJStiYWNrZ3JvdW5kR1EuWzI1NSwyNTUsMjU1XTYiLyUnb3BhcXVlR1EmZmFsc2U2Ii8lK2V4ZWN1dGFibGVHUSZmYWxzZTYiLyUpcmVhZG9ubHlHUSZmYWxzZTYiLyUpY29tcG9zZWRHUSZmYWxzZTYiLyUqY29udmVydGVkR1EmZmFsc2U2Ii8lK2ltc2VsZWN0ZWRHUSZmYWxzZTYiLyUscGxhY2Vob2xkZXJHUSZmYWxzZTYiLyU2c2VsZWN0aW9uLXBsYWNlaG9sZGVyR1EmZmFsc2U2Ii8lLG1hdGh2YXJpYW50R1EnaXRhbGljNiJRITYiLSUpX1ZJU0lCTEVHNiMiIiItJSVST09URzYnLSUpQk9VTkRTX1hHNiMkIiIhISIiLSUpQk9VTkRTX1lHNiMkIiIhISIiLSUtQk9VTkRTX1dJRFRIRzYjJCIlK10hIiItJS5CT1VORFNfSEVJR0hURzYjJCIlK10hIiItJSlDSElMRFJFTkc2Ii0lK0FOTk9UQVRJT05HNictJSlCT1VORFNfWEc2IyQiIiEhIiItJSlCT1VORFNfWUc2IyQiIiEhIiItJS1CT1VORFNfV0lEVEhHNiMkIiUrXSEiIi0lLkJPVU5EU19IRUlHSFRHNiMkIiUrXSEiIi0lKUNISUxEUkVORzYiRzYi +NistJSdDVVJWRVNHNiU3XVxsNyQkISQrIiEiIiQhMVdoKW9odXNNJSEjPDckJCEwQlkjXD1GVSkqISM5JCExYSY0bXAiUmMjKSEjPDckJCExOktrR00uMCgqISM6JCEyKUhyayh6MFk6IiEjPDckJCExJnljOFolcF0mKiEjOiQhMnVsbHEkPSwvOiEjPDckJCExI1F3X1hLYFIqISM6JCEyJ1J0KylcZGEjPSEjPDckJCExJHBReCUpMzJDKiEjOiQhMll4R3BBIz0yQCEjPDckJCExZjxOcUhOKDQqISM6JCExTSU0XikqKip6SyMhIzs3JCQhMDI5R0U7KlsqKSEjOSQhMiZ6a20uajs1RCEjPDckJCEwcFB2IUdTJnopISM5JCEyLj8xLF0kKlFrIyEjPDckJCExI1wpcFJBKik9KCkhIzokITEjZjh0PC0mKW8jISM7NyQkITEnSGY9biJRVScpISM6JCExJDQtIjM+InpyIyEjOzckJCExemU8NTkuLicpISM6JCExL2JlRSE9cXMjISM7NyQkITFpQ1xbNm9qJikhIzokITEsakkqRyIqPnQjISM7NyQkITFYITRvKTNMQyYpISM6JCExQzZIQ2QhR3QjISM7NyQkITFHYzdEMSlcWykhIzokITJ4JHBxUTlXSEYhIzw3JCQhMUxsSWg2bTolKSEjOiQhMmF2J1xAQEo4RiEjPDckJCExUHVbKHBUak0pISM6JCEyYVxxb1BaVG8jISM8NyQkITEpWyhcKlIvJG8jKSEjOiQhMT5aMCN5ZWRqIyEjOzckJCExUHZdLHJFIT4pISM6JCEyPGw/U2pGNWQjISM8NyQkITExN0NbO2JMISkhIzokITJGJT07KHkyRlIjISM8NyQkITFlPE5xc18jKXkhIzokITJ5ZU40OEBCOyMhIzw3JCQhMXJUJG9tI1FYeCEjOiQhMUxeelFbdTE+ISM7NyQkITEzPE1vV0kjZSghIzokITJQX1IoUj0uXjohIzw3JCQhMDM7SyVlOld1ISM5JCExdSMpUU1mSDY3ISM7NyQkITFjN0RdaFgkRyghIzokITBEJWVIXksoeighIzs3JCQhMTZCWSNwNDc5KCEjOiQhMicqSFl1KUc7RlAhIz03JCQhMSczPE15VV4pcCEjOiQiMGNIdjInPWIiKiEjPDckJCExJilwUnosYE9vISM6JCIxYnVidGs0OmEhIzw3JCQhMVJ6ZTwmbzlvJyEjOiQiMiN6R2krJil6MzUhIzw3JCQhMXdeLjJOMlJsISM6JCIyKD5eWyI9X25VIiEjPDckJCExIkdjN0QiWyZRJyEjOiQiMkFrbzMmeW5iPSEjPDckJCExJzQ+UTFVZkEnISM6JCIyR3Mzc2Fja0UjISM8NyQkITEvMztLRjEoMychIzokIjF6N1V4PCRvZSMhIzs3JCQhMUppQ1wjcHEkZiEjOiQiMiZcTi85QSplKUchIzw3JCQhMThFXy84NiN5JiEjOiQiMSM+S2pDSWU4JCEjOzckJCExdFkkcD06MGomISM6JCIyMU9IbUteYUokISM8NyQkITAlemVubTxkYiEjOSQiMjlNYFAmPWd4TCEjPDckJCExMTdDWyJRUVsmISM6JCIyKGYkcHdaISpHVSQhIzw3JCQhMWU6Sig9QkpXJiEjOiQiMS1dWDEnKmVTTSEjOzckJCEwIj5RRSMzQ1MmISM5JCIyO0lHbm0hKkdYJCEjPDckJCExJjM8ZnVdP1EmISM6JCIxbGcoeiYpKSpwWCQhIzs3JCQhMWhBWGxLcGhgISM6JCIyT2tveCNvdGZNISM8NyQkITFQdSlceU44TSYhIzokIjE5J0hFcCk0aE0hIzs3JCQhMThFXy8keTRLJiEjOiQiMlkhUVZqIXo1WSQhIzw3JCQhMSJHYzc1JVIlRyYhIzokIjJFWzpEVWN2WCQhIzw3JCQhMCYqKil6Kik0eUMmISM5JCIxcEJnJlFLJlxNISM7NyQkITE9T3MlcEQ3QCYhIzokIjJicjNDKnkpcFYkISM8NyQkITEoR2Q5XFRZPCYhIzokIjIkUVB5Jz00Kj5NISM8NyQkISknPWw0JiEiKCQiMSI9QWxwRiNvTCEjOzckJCExOEZhM2RSPV0hIzokIjJ3InopUS1SZUgkISM8NyQkITFqRWAxUSJvKFshIzokIjFXS0BmJD1CNiQhIzs3JCQhMXVaJjRSRj9zJSEjOiQiMldBemlAKEhPRyEjPDckJCExPE1vT2FRd1ghIzokIjFBO2ArTSV6XSMhIzs3JCQhMVUjWydIdzlDVyEjOiQiMmQuZWR3NiYpNCMhIzw3JCQhMW9PdFl0SXZVISM6JCIydVIpW0ZoKCpROyEjPDckJCExMztLa2BbPlQhIzokIjI2KkckUTMtSzUiISM8NyQkITJWKW9Qdi1UcFIhIzskIjEmPVU1UWhGViYhIzw3JCQhMUdiNUBvJGYiUSEjOiQhMSNlRSFSQC5raiEjPTckJCExOEVfL1V0ak8hIzokITEtSzklcDV5KW8hIzw3JCQhMXdeLjJlKFFfJCEjOiQhMXpwTGddanQ3ISM7NyQkITJGXi0wSSNlakwhIzskITJ1R3pVRkJRJT4hIzw3JCQhMU5wUXhRQD9LISM6JCExWXo+MDQpPmAjISM7NyQkITEjUnljQmB0MSQhIzokITIyP091UGthOCQhIzw3JCQhMlkjXClwNFk1I0ghIzskITI6NXMiM0VPek8hIzw3JCQhMWAwNkEzZmVGISM6JCExIltMQmFAQUIlISM7NyQkITF1WiY0XDt6aCMhIzokITJZVjRaJVsjemwlISM8NyQkITFyVCRvJylcI2VDISM6JCExN1ZPVjZOcl0hIzs3JCQhMTQ9T3M1dDdCISM6JCEwNmloekBjUCYhIzo3JCQhMCwtL1FjTjojISM5JCExS10kekVlO2kmISM7NyQkITFrRmJnZilbMyMhIzokITFlY2YsXz4pcCYhIzs3JCQhMnVeLjJhOmksIyEjOyQhMV53KikpKnpFY2QhIzs3JCQhMj1Pc1d1NnIoPiEjOyQhMWpxK0pVJjR5JiEjOzckJCExMTdDW3orUT4hIzokITFqeGhzLlwqeiYhIzs3JCQhMi4wNT86LyopKj0hIzskITBGZzMoPSQ9ImUhIzo3JCQhMlgqKXlkTispZj0hIzskITFmMzMleVR6ImUhIzs3JCQhMSc9UHU9OTQlPSEjOiQhMUAmUVA0Xyc9ZSEjOzckJCEydVomND4hRz8jPSEjOyQhMWJXbCY+Kip5ImUhIzs3JCQhMipvUHZdPTkuPSEjOyQhMTo6KHkmM286ZSEjOzckJCEyLjE3Q29iVXkiISM7JCEwXmYzRiYqPiJlISM6NyQkITJMa0dkTSRbWTwhIzskITFUIylIR3NAK2UhIzs3JCQhMmlBWCE0NXIzPCEjOyQhMVk4UHEhZkR5JiEjOzckJCEyJ0hmPShvOktqIiEjOyQhMTdKayVvYSdIZCEjOzckJCEyS2pFYE8/eGIiISM7JCExciYqXDQmZUxsJiEjOzckJCEyTnNXKik9JkcyOSEjOyQhMVUzQWJ3WUthISM7NyQkITJ2XCoqKXpTd2k3ISM7JCExPiFHM1tJaTgmISM7NyQkITI7TW9PJEhgMTYhIzskITIuciMqNEQmKnpzJSEjPDckJCExemQ6SktMdyYqISM7JCExTFwnNEJqKWZVISM7NyQkITE9T3NXXEI0ISkhIzskITFCPyNSInAoPnAkISM7NyQkITEuMjlHT2ohZichIzskITFbYWsqeS8nPkohIzs3JCQhMSwtLzNPIkctJiEjOyQhMm83PmFxTklWIyEjPDckJCEyJ3lkOkpfNkBOISM8JCEvT1IxTVRMPCEjOTckJCEyUXZdLC5zSS0jISM8JCEyemx3Jyl5cGorIiEjPDckJCExRV4tMDVnJGUlISM8JCExUjVMKW8pPiJIIyEjPDckJCIxT3JVJjNueiMpKiEjPCQiMi8pcFF1SDAzXCEjPTckJCIyOklnP1RRKGVDISM8JCIyOShwJSpcRDU/NyEjPDckJCIyJ3ljOEZNTikzJSEjPCQiMnJ1Q2xhajwrIyEjPDckJCIxVSYzPE1PUWMmISM7JCIybVtkVVhdY24jISM8NyQkIjF1WyhcKlJ6c3EhIzskIjFlSzsvZCMpPkwhIzs3JCQiMTI6SWddTzInKSEjOyQiMkM9NXFTU3MiUiEjPDckJCIyJz1QdVtNeiw1ISM7JCIxR19zcz5MMVchIzs3JCQiMnhhND5lYkA6IiEjOyQiMTQ2ZXolNGomWyEjOzckJCIyJz1QdVtKUCw4ISM7JCIxPV9ZOydIS0EmISM7NyQkIjIuMjlHYyopNFkiISM7JCIxJVJYKikzVDxfJiEjOzckJCIyPU1vTzhXPWciISM7JCIxNDZYITQjeStkISM7NyQkIjJfLTA1Zy1KbyIhIzskIjFLJ1FyIkhDbmQhIzs3JCQiMiczPE1vNU9rPCEjOyQiMTBcJSk0WF8xZSEjOzckJCIxQFUlUVckcCN5IiEjOiQiMWJhdGBZaTZlISM7NyQkIjJQdFkkPmUtLD0hIzskIjFiIVtmJDRNOmUhIzs3JCQiMmpDXFs+ZSQ+PSEjOyQiMWo5ZCdldXciZSEjOzckJCIyKWU8TnEwcFA9ISM7JCIxeT5kNnNpPWUhIzs3JCQiMjlGYWUlSC1jPSEjOyQiMTg4MCN6KyM9ZSEjOzckJCIyUXljOEtiVig9ISM7JCIxdGhSJG8oUjtlISM7NyQkIjJsSGZvcChvIyo9ISM7JCIxUSk+Vmg/SyJlISM7NyQkIjIjND1PcystNj4hIzskIjEqMyd6Jm9zJzNlISM7NyQkIjI6SGU7eXZOKT4hIzskIjE8WUtya0h4ZCEjOzckJCIxdVomNFxKaDAjISM6JCIxJSpcNHkseUNkISM7NyQkIjJiMzxNKUc8N0EhIzskIjE5OFQvVS1VYiEjOzckJCIxKFF4YVxYKW9CISM6JCIxczZGNk8kcEUmISM7NyQkIjIlZj1QdVZSNkQhIzskIjEnXGZtUmxEJVwhIzs3JCQiMlF6ZTwmXHhpRSEjOyQiMVRranNoL0dYISM7NyQkIil3XTVHISIoJCIwQ2RyKEg5aVMhIzo3JCQiMUppQ1w4bHFIISM6JCIxeEhRU11JKlwkISM7NyQkIjFGYTM8LUE0SiEjOiQiMWRsaXE4RnRIISM7NyQkIjJ0WyhcKmZyJG9LISM7JCIxKUhYZ3EiR09CISM7NyQkIjJkOUhlRSMpelQkISM7JCIyWFAxKyF5Pzw8ISM8NyQkIjEyOUdjeTltTiEjOiQiMk9vOSR6TVInNCIhIzw3JCQiMVJ5Yzg4VjlQISM6JCIxZWUoXGhAcHklISM8NyQkIjJWJSlvUDByYydRISM7JCEyYT9MZDAvPE8iISM9NyQkIjE9T3NXRSlmLSUhIzokITBEVjxJWHplKCEjOzckJCIxJilvUHZFKEg8JSEjOiQhMShRaj5EXUdIIiEjOzckJCIxXi0wNTIyPVYhIzokITJDXk9sQypldzwhIzw3JCQiMUZiNUAieUpaJSEjOiQhMm08Ils1PFNQQSEjPDckJCIxQVcpbyh5JXppJSEjOiQhMXYoPlYvVDpqIyEjOzckJCIwND1PI0gnb3clISM5JCEyPCZReksvPENIISM8NyQkIjFfLjI5eVRKXCEjOiQhMihHIlJHdUQ1PiQhIzw3JCQiMiYqKXlkOig0InBdISM7JCExaycqXChHJj1YTCEjOzckJCIxKnBSenlLJ1xeISM6JCExaiFmemI/Y1MkISM7NyQkIjEyOklnZTpJXyEjOiQhMXNdJCpwVS9XTSEjOzckJCIxYzZCJ2YiZW9fISM6JCEyWGBDJ0c9a2FNISM8NyQkIjEvMztLdCsyYCEjOiQhMVZOMmdPRWdNISM7NyQkIjFHYzcrLUFFYCEjOiQhMmpHIjNpa0BoTSEjPDckJCIxXy80b0lWWGAhIzokITElSCpwcmEkNFkkISM7NyQkIjF3XzBPZmtrYCEjOiQhMkVmaHMqW1VmTSEjPDckJCIvLC0vKWVRUSYhIzgkITJPIyopPlQkKm9jTSEjPDckJCIxMztLOSF5Q1gmISM6JCEyODhcSVUpKnBWJCEjPDckJCIxO0ppQ3M0QGIhIzokITIkenNUPiM9P1MkISM8NyQkIjFLakUubkUpZiYhIzokITF6dGBOZyNbTSQhIzs3JCQiMVomND49T2FuJiEjOiQhMiVRX15MWEZwSyEjPDckJCIyJlwqKil6Pil6SWUhIzskIS8iM0NfOlUxJCEjOTckJCIxUXdfMD1VJilmISM6JCEyO1RUSVFxX3ojISM8NyQkIjF0WCJIb3goR2ghIzokITJfWSMzXVJvJVwjISM8NyQkIjI6RV8vUjlzRichIzskITInRyo0J1FqJypRQCEjPDckJCIxVydHZCV5c0lrISM6JCExW2tndXVFSzwhIzs3JCQiMU9xUyIpKltQZSchIzokITJpOlc0OTR0SCIhIzw3JCQiMS4yOUcrOlRuISM6JCExcm4pRyY+JSkpSCkhIzw3JCQiMSYqKXlkJiopeXpvISM6JCEyYXY9Wih6My5UISM9NyQkIjElemU8YmplLighIzokIjFsUC87a0F3ZyEjPTckJCIyYjdEXSt6RD4oISM7JCIxOmgwTFs2Pl8hIzw3JCQiMXRYIkhRLk9NKCEjOiQiMUVGUTpXel8lKiEjPDckJCIxaEBWJyl6dSFbKCEjOiQiMWZQakhgUC84ISM7NyQkIjFCWSNcPUVRayghIzokIjFNb0FMQlMicCIhIzs3JCQiMV4tMDVbKD55KCEjOiQiMmtENSRvWC56PiEjPDckJCIxdl0sLlhuVXohIzokIjJ3Nj83akMyRSMhIzw3JCQiMC0vMyc0I1wzKSEjOSQiMnczNGd6XCJlQyEjPDckJCIxWSNcKXB5KTRDKSEjOiQiMSdSVWs9XFxoIyEjOzckJCIxJ0hmPTwlSDokKSEjOiQiMSNmNnQ8a29tIyEjOzckJCIxWiRwUVorJypRKSEjOiQiMT53bHVqKFFxIyEjOzckJCIxMztLKillT0clKSEjOiQiMVYxPVpRQzxGISM7NyQkIjFwUXgvODhuJSkhIzokIjFtW2lGUWBFRiEjOzckJCIxSmhBP24qZV0pISM6JCIxZSU+SyM0dkpGISM7NyQkIjEjUnljOGlZYSkhIzokIjJtUDROZDBIdCMhIzw3JCQiMSNlOyQpKTNFIWUpISM6JCIxc3RzIlwsL3QjISM7NyQkIjF1WiY0a2ZlaCkhIzokIjFqeExNP11DRiEjOzckJCIxa0hmJFJlOWwpISM6JCIxOiRRQzVHX3IjISM7NyQkIjFjNkJZcjAobykhIzokIjExaGU4WWctRiEjOzckJCIxLjE3dUsmUXcpISM6JCIxYWg0d3A1a0UhIzs3JCQiMV4rLC0lXDElKSkhIzokIjJgayUzJSlHXjVFISM8NyQkIjFPc1cqZSk9KyEqISM6JCIyd3BWPDEnKkdYIyEjPDckJCIxRmI1QHoxUiIqISM6JCIyX18zYnZ5IW9BISM8NyQkIjEsLC0vOTEqRyohIzokIjBLZScqUU1PLSMhIzo3JCQiMHNWKFskPlNXKiEjOSQiMTxISVdaXEc8ISM7NyQkIjFlO0xtYWgmZiohIzokIjE3M1dTcS4wOSEjOzckJCIxRF4tMERIVSgqISM6JCIyckNhTXQ2bjEiISM8NyQkIjBzVihbQjowKiohIzkkIjByTz53TyY0biEjOzckJCIyWCE0PTsqW14rIiEjOiQiMjlKJ0gwRXdjSSEjPTckJCIyPk9zV1x0Mi0iISM6JCExbHFBY2ViUyYpISM9NyQkIjJvT3RZb0pcLiIhIzokITJXWyQ+dyxLSlYhIz03JCQiMmU6SmlLNS8wIiEjOiQhMHRPSmpRKnl6ISM7NyQkIjI6SGU7X3VcMSIhIzokITIiKSk0SW5qQj42ISM8NyQkIjE0PU8tJCk+ITMiISM5JCEyTGdbKHA1VkQ5ISM8NyQkIjJrRWAxTCMzJjQiISM6JCEyXy9oSl0yJCpvIiEjPDckJCIyQ1olKilHWG01NiEjOiQhMkJQW1FvV0EjPiEjPDckJCIyWiUqKXlQP25ENiEjOiQhMkNfKT5pYj4rQCEjPDckJCIyLzM7S1E+NTkiISM6JCEybC9hZi4mZkpBISM8NyQkIjJpQVhTXkgnWzYhIzokITIoUjx3VSQ+cUYjISM8NyQkIjFzVihba1JpOiIhIzkkITJQP0ZjKmU1NEIhIzw3JCQiMnliNls1TyhmNiEjOiQhMjxkTiVmcU0+QiEjPDckJCIyUXVbWmNLSzsiISM6JCExVCIqKXpgWm5LIyEjOzckJCIyKEhmb0MhSG47IiEjOiQhMUtaY1dvSUpCISM7NyQkIjJjNkJZW0QtPCIhIzokITI8Q0RdKXktTEIhIzw3JCQiMkBWJ0dBR0J1NiEjOiQhMnQzZUwuPTpMIyEjPDckJCIyKVsoXCpmLEN5NiEjOiQhMk49XE88LmpLIyEjPDckJCIyYDE4d1xaQT0iISM6JCEyOTZvOydSUzxCISM8NyQkIjI9UXdfJFtEJz0iISM6JCEyaWdkWndZW0kjISM8NyQkIjIzO0trREJNPiIhIzokITJ6KFsmRzxrTEYjISM8NyQkIjIoUnpleDtmKzchIzokITI3OSp6Ino0MEIjISM8NyQkIjElemU8dXhlQCIhIzkkITJ2Jz1dNjBfLUAhIzw3JCQiMjM5R2NYMzBCIiEjOiQhMkc9QSMpR0doJD4hIzw3JCQiMXliNiQpUnZZNyEjOSQhMk5EXy15MGdxIiEjPDckJCIyZTpKaVRAM0UiISM6JCEybj9iaSE+MHQ5ISM8NyQkIjE7S2t5ISl5dzchIzkkITJKJSlcVEc9czwiISM8NyQkIjJCWCE0ZSpSOEgiISM6JCExUGkkPSRSQ1spKSEjPDckJCIxS2tHRnVEMjghIzkkITFNWS03czB5YSEjPDckJCIyOkdjN14iKjRLIiEjOiQhMUYvdVNMdSpbIyEjPDckJCIyUHVbKEhJak84ISM6JCIxVyJcKGUyI0dIKiEjPTckJCIyMDZBVyc+dV44ISM6JCIyd3l2KEhCcHRUISM9NyQkIjIpcFJ6RzUlb08iISM6JCIxXnlHUCM0Z0coISM8NyQkIjIzO0trYSUpPVEiISM6JCIyUVpGXjcmKSo9NSEjPDckJCIyTW9PdGxPalIiISM6JCIyO0QoeUZnaHQ3ISM8NyQkIjEqemY+eGY+VCIhIzkkIjJOSDA7JSlHaV4iISM8NyQkIjJgMjpJdFxvVSIhIzokIjJ2VkZESUU1ciIhIzw3JCQiMShSemVyP0RXIiEjOSQiMmxxTTFdNkwoPSEjPDckJCIyaEFYIUhucWM5ISM6JCIyJSplJFw8KCllej4hIzw3JCQiMidHZDlIZWFrOSEjOiQiMmlPNytKYTUtIyEjPDckJCIyN0JZI0hcUXM5ISM6JCIyYSF5OTxnKCpcPyEjPDckJCIyQlcpPXYiUmhaIiEjOiQiMjlWXyhHKVwkZj8hIzw3JCQiMktsSTZVJCopejkhIzokIjJrcmBPajllMSMhIzw3JCQiMlcnRzJud2skWyIhIzokIjJWQmQjRyhvJHA/ISM8NyQkIjJgMjpJIj5TKFsiISM6JCIyO2UkKVJYOSsyIyEjPDckJCIxKWU8NS1aNlwiISM5JCIycyo+eCI+bngxIyEjPDckJCIyMDU/IUhAKltcIiEjOiQiMnYqRz9cQmtpPyEjPDckJCIxOEUtUHNqKVwiISM5JCIxXGA4JT1hWTAjISM7NyQkIjJkN0RdTSNRLTohIzokIjE2U2V3MyNRLyMhIzs3JCQiMm9PdFkhZj81OiEjOiQiMiMpcFsyKD02Nz8hIzw3JCQiMiIzO0trJUghPTohIzokIjFDWWA+R01vPiEjOzckJCIyLjE3Qy5UQ2AiISM6JCIwdCwvKTNIZD0hIzo3JCQiMmlCWiVcLz9aOiEjOiQiMiRcJyl5T1o1MDwhIzw3JCQiMioqKXpmKmYnXGo6ISM6JCIyM1lgYCRlQidcIiEjPDckJCIyJz1QdUc5RHk6ISM6JCIyYmUubGpGXEYiISM8NyQkIjI9UXdfK1RMZiIhIzokIjJBPnkhKSlIT0E1ISM8NyQkIjFbJ0hmcidvMzshIzkkIjEvJSlbKkhdT1coISM8NyQkIjEwNT81Q3pBOyEjOSQiMTsybDpWJ3B2JSEjPDckJCIyeWU8TmlHeWoiISM6JCIxKG9BZzRtbiI9ISM8NyQkIjEwNT8hUV1GbCIhIzkkITJ2TFw4XFtbNiIhIz03JCQiMC8zOy03KG87ISM4JCExcCgpPSJRaEY+JSEjPDckJCIydlkkcHl1eiNvIiEjOiQhMUM6MmApZiIqeichIzw3JCQiMS8zO3MiXCEqcCIhIzkkITFCW2tuJUcuaCohIzw3JCQiMTlHY3Ndcjg8ISM5JCEySCIpZSFHTC8iPiIhIzw3JCQiMjI2QVdARSNHPCEjOiQhMldueSUpb048UiIhIzw3JCQiMjxNb09OSVF1IiEjOiQhMTtHaSpHeEpkIiEjOzckJCIxc1YoW2goXGY8ISM5JCEyTUMsZDJmYnIiISM8NyQkIjIjPlF3LUR2dDwhIzokITIoUWhtb2MkeSE9ISM8NyQkIjJkO0w7YEA4eSIhIzokITFYMEdXQSE9JT0hIzs3JCQiMkVeLTBjISopKXkiISM6JCEydnYlZjJPOGw9ISM8NyQkIjJGYTNuKFFlI3oiISM6JCEyX0l0RmNHRSg9ISM8NyQkIjJHZDlIPnhpeiIhIzokITJBREtTZGt2KD0hIzw3JCQiMS4xNzQwKCoqeiIhIzkkITJ5RThtPVMqej0hIzw3JCQiMktqRWAjUW0uPSEjOiQhMiYqSHlbU2Qoej0hIzw3JCQiMlslKil5NzVuNj0hIzokITJpJVI4IilmZ3E9ISM8NyQkIjJqRF4tP3knPj0hIzokITIxeS9ydnEmXD0hIzw3JCQiMmlAVk9rMW0jPSEjOiQhMWwrMiJcPz4jPSEjOzckJCIxd14uKDNOTiQ9ISM5JCEyM2c+MUV2Y3kiISM8NyQkIjEjUXdfQV0lXD0hIzkkITEjWyYzIVxcNW4iISM7NyQkIjJ4YTQ+SDZXJz0hIzokITEpcD5GKCl6ZV8iISM7NyQkIjF1WiY0JnlBej0hIzkkITFUQHZeXSgpXDghIzs3JCQiMTxNbyc+Y1MqPSEjOSQhMjhcMlkoKSpwWDYhIzw3JCQiMnheLjI8IT00PiEjOiQhMWh5QUclKilSOCohIzw3JCQiMSYqKil6SDhARD4hIzkkITFRUmh5LXdtayEjPDckJCIyPUtrR0w1KlI+ISM6JCExI1JpLEk2VCpRISM8NyQkIjFlO0xPLFVhPiEjOSQhMncqKWVAPVU6SCIhIz03JCQiMmU9UHUoMyQqcD4hIzokIjJLandxOTZ4XCIhIz03JCQiMmIyOkkmeVMmKT4hIzokIjEob1N4KFJfQlUhIzw3JCQiJCsjISIiJCIxMF1lPENKJG8nISM8LSUnTEVHRU5ERzYjLSUpX1RZUEVTRVRHNiNRIko2Ii0lJkNPTE9SRzYnJSRSR0JHJCIpQyllcSUhIikkIiIhISIiJCIoJz4hXCYhIiktJStfQVRUUklCVVRFRzYjLyUnc291cmNlRyUsbWF0aGRlZmF1bHRHLSUnQ1VSVkVTRzYlN2R5NyQkISQrIiEiIiQhMSRcdngmZk1qTSEjPDckJCEwQlkjXD1GVSkqISM5JCExYj81MlpuQUUhIzw3JCQhMTpLa0dNLjAoKiEjOiQhMjsicG4oKm9UOT0hIz03JCQhMSZ5YzhaJXBdJiohIzokITE8aiVcJ1IvciQpISM9NyQkITEjUXdfWEtgUiohIzokIjFkOGQ5VSJcKj4hIz03JCQhMSRwUXglKTMyQyohIzokIjEiXFA1I3kmNEUiISM8NyQkITFmPE5xSE4oNCohIzokIjJXQ1xENF8wRCMhIz03JCQhMDI5R0U7KlsqKSEjOSQiMi9ZXz9mQyplSyEjPTckJCEwcFB2IUdTJnopISM5JCIxdSQzJDQ6amdVISM8NyQkITEnSGY9biJRVScpISM6JCIyJj1sPGEnb0k+JiEjPTckJCExR2M3RDEpXFspISM6JCIxJCo+VGxBOGVnISM8NyQkITFQdVsocFRqTSkhIzokIjFeIlEiXC1gQG4hIzw3JCQhMVB2XSxyRSE+KSEjOiQiMSVHW0xiKVxQdCEjPDckJCExMTdDWztiTCEpISM6JCIxREJ5YzA0KHooISM8NyQkITEjWydIZiVSIWV6ISM6JCIxQm9XKG9NayZ6ISM8NyQkITFlPE5xc18jKXkhIzokIjE4a1IoZV1JMikhIzw3JCQhMWxIZm9cJlIieSEjOiQiMSJcTHU9IXBTIikhIzw3JCQhMXJUJG9tI1FYeCEjOiQiMSVwLidmWyM0PCkhIzw3JCQhMVJ6ZW5OJVFtKCEjOiQiMSMpXHhuNjRkIikhIzw3JCQhMTM8TW9XSSNlKCEjOiQiMTw1Ll9PPCkzKSEjPDckJCExJiopeWQ6SUteKCEjOiQiMSlRQiFbSDgnKXohIzw3JCQhMDM7SyVlOld1ISM5JCIxJHp6SlBjUCV5ISM8NyQkITFjN0RdaFgkRyghIzokIjFRdTlfS0VjdCEjPDckJCExNkJZI3A0NzkoISM6JCIxRSNbIyk0Z1d1JyEjPDckJCExJzM8TXlVXilwISM6JCIxX2p1JzR4XCllISM8NyQkITEmKXBSeixgT28hIzokIjEvISlmb2ghUSpbISM8NyQkITFSemU8Jm85bychIzokIjImW0AqKVw1TyZwJCEjPTckJCExd14uMk4yUmwhIzokIjFMdFlzTzhrQyEjPDckJCExIkdjN0QiWyZRJyEjOiQiMm4+JzQtQzQ9NSEjPTckJCExJzQ+UTFVZkEnISM6JCExQ2RYME8zXWUhIz03JCQhMS8zO0tGMSgzJyEjOiQhMmldNnN5UCFRPyEjPTckJCExSmlDXCNwcSRmISM6JCEwTVskPU5uUE8hIzs3JCQhMThFXy84NiN5JiEjOiQhMTpuPWJuIyopRyYhIzw3JCQhMXRZJHA9OjBqJiEjOiQhMXo6WUUkNG0nbyEjPDckJCExMTdDWyJRUVsmISM6JCEwSl93JnpeQSQpISM7NyQkITE4RV8vJHk0SyYhIzokITEoWyRlS1M/OykqISM8NyQkITEoR2Q5XFRZPCYhIzokITJzQlYqeT46LDYhIzw3JCQhMThGYTNkUj1dISM6JCEyRiUqKnohcFInNDchIzw3JCQhMWpFYDFRIm8oWyEjOiQhMTRlWlRZeihHIiEjOzckJCExdVomNFJGP3MlISM6JCExPShSLyoqRyJbOCEjOzckJCExJzQ+UVQxI1xZISM6JCExJjMtW0B3bE8iISM7NyQkITE8TW9PYVF3WCEjOiQhMFdXYGteI3k4ISM6NyQkITFCWSNcKWZLUVghIzokITIvKWVlPG1jIlEiISM8NyQkITAkZTtMbEUrWCEjOSQhMTQqSChcKD5IUSIhIzs3JCQhMU5xUyIzMkFZJSEjOiQhMiNHI2VIJGZGI1EiISM8NyQkITFVI1snSHc5Q1chIzokITJOYzU3IT1nejghIzw3JCQhMWI0PilbRihcViEjOiQhMltKdEYoeVFvOCEjPDckJCExb090WXRJdlUhIzokITImcD1LZmwyXDghIzw3JCQhMVF3X2JqUig+JSEjOiQhMjJNUVgnKXoqPjghIzw3JCQhMTM7S2tgWz5UISM6JCEyUHpgO3NBO0ciISM8NyQkITJWKW9Qdi1UcFIhIzskITJ6bCRwZCs5Ij0iISM8NyQkITFHYjVAbyRmIlEhIzokITJzcSIzJkd0Oy8iISM8NyQkITE4RV8vVXRqTyEjOiQhMWVeSjgjKj1tJykhIzw3JCQhMXdeLjJlKFFfJCEjOiQhMVFTYTckKUhSbiEjPDckJCEyRl4tMEkjZWpMISM7JCExLCNwa2ZRcjslISM8NyQkITFOcFF4UUA/SyEjOiQhMlFHLzZeK0ZiIiEjPTckJCExI1J5Y0JgdDEkISM6JCIyaiJcJT5ULCVSOiEjPTckJCEyWSNcKXA0WTUjSCEjOyQiMms1SnRjc3h3JSEjPTckJCExYDA2QTNmZUYhIzokIjFLMmlWQ0hDJykhIzw3JCQhMXVaJjRcO3poIyEjOiQiMi9ILXM2YGdAIiEjPDckJCExclQkbycpXCNlQyEjOiQiMkMpKSpcalw3TjshIzw3JCQhMTQ9T3M1dDdCISM6JCIyOjB6VUhwIkg/ISM8NyQkITAsLS9RY046IyEjOSQiMiZRZmhHTkBvQyEjPDckJCEydV4uMmE6aSwjISM7JCIyWT08JW89VVxHISM8NyQkITJYKil5ZE4rKWY9ISM7JCIxV0cnKlFUNCJHJCEjOzckJCEyaUFYITQ1cjM8ISM7JCIxXChvUGxhLnAkISM7NyQkITJLakVgTz94YiIhIzskIjJWXmE7dj1sMyUhIzw3JCQhMk5zVyopPSZHMjkhIzskIjFwISo9LmBTalchIzs3JCQhMnZcKiopelN3aTchIzskIjF0Ul1UZz0vWyEjOzckJCEyO01vTyRIYDE2ISM7JCIxc2deKSl5SVdeISM7NyQkITF6ZDpKS0x3JiohIzskIjAieSdmIik+b1YmISM6NyQkITE9T3NXXEI0ISkhIzskIjFyNndeejEyZCEjOzckJCExLjI5R09qIWYnISM7JCIxJmZHOjpIXyJmISM7NyQkITEsLS8zTyJHLSYhIzskIjBqVS0iKXA9NSchIzo3JCQhMid5ZDpKXzZATiEjPCQiMWZFSm83WU5pISM7NyQkITFtS2xJTzRzRiEjOyQiMWRhSD5gKFxHJyEjOzckJCEyUXZdLC5zSS0jISM8JCIxOl1HSi4nR0snISM7NyQkITJNcFF4LyUqPWoiISM8JCIxPSJvbz16ekwnISM7NyQkITJLakVgMTsyQyIhIzwkIjF2Lj8rcSgpXGohIzs3JCQhMUdkOUgzUSZcKSEjPCQiMTdrLGBHYWVqISM7NyQkITFFXi0wNWckZSUhIzwkIjApM1giem9STychIzo3JCQhMS4xN0MpKjMyKSohIz0kIjEwbTF2YzRtaiEjOzckJCIyXyssLS8kPUFFISM9JCIxTTIxKj5vYU8nISM7NyQkIjFyUyJHMXZdQSchIzwkIjFiOTVfbzNpaiEjOzckJCIxT3JVJjNueiMpKiEjPCQiMVZDVm5VJmZOJyEjOzckJCIydV0sLmNuMnMiISM8JCIxdVNkJWVFW0wnISM7NyQkIjI6SWc/VFEoZUMhIzwkIjBERkhxWkFJJyEjOjckJCIyJ3ljOEZNTikzJSEjPCQiMXkjRyM9aUshPichIzs3JCQiMVUmMzxNT1FjJiEjOyQiMWJbTkYhKXlVZyEjOzckJCIxdVsoXCpSenNxISM7JCIxQWdpTTVhW2UhIzs3JCQiMTI6SWddTzInKSEjOyQiMFc9bylRczNjISM6NyQkIjInPVB1W016LDUhIzskIjEiM2ZFa0hOTiYhIzs3JCQiMnhhND5lYkA6IiEjOyQiMTlyJykqcCskW10hIzs3JCQiMic9UHVbSlAsOCEjOyQiMSxOXEkvVjpaISM7NyQkIjIuMjlHYyopNFkiISM7JCIyPGopWzNCQEpWISM8NyQkIjI9TW9POFc9ZyIhIzskIjFNKilRJVt4QihSISM7NyQkIjInMzxNbzVPazwhIzskIjIlPkRWa0YkM2EkISM8NyQkIjIjND1PcystNj4hIzskIjFYWW5PImUuOSQhIzs3JCQiMXVaJjRcSmgwIyEjOiQiMVJqJmYzWydRRiEjOzckJCIyYjM8TSlHPDdBISM7JCIyLlRnT2gwZkkjISM8NyQkIjEoUXhhXFgpb0IhIzokIjJWZCJHV1o4dz0hIzw3JCQiMiVmPVB1VlI2RCEjOyQiMidmZWUkPldRXCIhIzw3JCQiMlF6ZTwmXHhpRSEjOyQiMiVlc2woeT46NSIhIzw3JCQiKXddNUchIigkIjFIWiUqKik0R2p0ISM8NyQkIjFKaUNcOGxxSCEjOiQiMF9zQDY1YmskISM7NyQkIjFGYTM8LUE0SiEjOiQiMXR0dCkqMzxGbSEjPTckJCIydFsoXCpmciRvSyEjOyQhMCJvVUReIkdZIyEjOzckJCIyZDlIZUUjKXpUJCEjOyQhMlgoXFA4LGojMyYhIz03JCQiMTI5R2N5OW1OISM6JCExejkheVc3TU4oISM8NyQkIjFSeWM4OFY5UCEjOiQhMXVBTz1lcypHKiEjPDckJCIyViUpb1AwcmMnUSEjOyQhMiU+JDQiKTNeNDQiISM8NyQkIjE9T3NXRSlmLSUhIzokITJkJ1FvT087QjchIzw3JCQiMSYpb1B2RShIPCUhIzokITJ4QmBBZmYqMzghIzw3JCQiMnZjOEZwQGJDJSEjOyQhMXdzNStiLlI4ISM7NyQkIjFeLTA1MjI9ViEjOiQhMT01PTJXPGg4ISM7NyQkIjAyOUdjWm9OJSEjOSQhMmUoXFZfeSEpcDghIzw3JCQiMSopeWQ6V2kmUiUhIzokITIjSCJmbHBaaVAiISM8NyQkIjEzPE1vN1NNVyEjOiQhMlpQVyV6UV8hUSIhIzw3JCQiMUZiNUAieUpaJSEjOiQhMmlEQyhmJG9FUSIhIzw3JCQiMjtEXStjcT1eJSEjOyQhMk5XdWBAPEZRIiEjPDckJCIxdlwqKikqSGNdWCEjOiQhMTh2K0RJciFRIiEjOzckJCIxKXBSelZiIyplJSEjOiQhMlokZSE0QyRwdzghIzw3JCQiMUFXKW8oeSV6aSUhIzokITFvYyhcNShwcTghIzs3JCQiMWM3RCthUyhwJSEjOiQhMi9yaFM9MV5OIiEjPDckJCIwND1PI0gnb3clISM5JCExLkZpYSpITkwiISM7NyQkIjFfLjI5eVRKXCEjOiQhMjxVLzVqLyxFIiEjPDckJCIyJiopeWQ6KDQicF0hIzskITJuS3dGTj5vPCIhIzw3JCQiMTI6SWdlOklfISM6JCEya0koNDNobWQ1ISM8NyQkIi8sLS8pZVFRJiEjOCQhMScpUTdTXGRkIyohIzw3JCQiMTtKaUNzNEBiISM6JCExaSRSJG9QO2h6ISM8NyQkIjFaJjQ+PU9hbiYhIzokITFpRlVaWz8wayEjPDckJCIyJlwqKil6Pil6SWUhIzskITJ3PVh1OjJEeCUhIz03JCQiMVF3XzA9VSYpZiEjOiQhMUdfeVIxWj9KISM8NyQkIjF0WCJIb3goR2ghIzokITI5Pipwd2VfKGYiISM9NyQkIjI6RV8vUjlzRichIzskITFzaSFIN0FiMCchIz43JCQiMVcnR2QleXNJayEjOiQiMjpITVhXRWBYIiEjPTckJCIxT3FTIikqW1BlJyEjOiQiMi55UEwjenZpRyEjPTckJCIxLjI5Rys6VG4hIzokIjFld3YnUT5gPCUhIzw3JCQiMSYqKXlkJiopeXpvISM6JCIyKClmTkAvUSopPiYhIz03JCQiMSV6ZTxiamUuKCEjOiQiMk5ZPllPP2A9JyEjPTckJCIyYjdEXSt6RD4oISM7JCIxeUBEVUtsJSlwISM8NyQkIjF0WCJIUS5PTSghIzokIjFkMCtYU0RrdiEjPDckJCIxaEBWJyl6dSFbKCEjOiQiMFZnb0M5VSN6ISM7NyQkIjEjUnljMyhHaXYhIzokIjEnUS0qcDd1aSEpISM8NyQkIjFCWSNcPUVRayghIzokIjFFbEZTeklYIikhIzw3JCQiMVB1WyhcK0hyKCEjOiQiMXc7YmdRJj48KSEjPDckJCIxXi0wNVsoPnkoISM6JCIxaikqUiFvKFxmIikhIzw3JCQiMWpFYGNZS2l5ISM6JCIxdEZvPDsibzQpISM8NyQkIjF2XSwuWG5VeiEjOiQiMT0ycyZvd08peiEjPDckJCIwLS8zJzQjXDMpISM5JCIvOGM1dDZsdyEjOjckJCIxWSNcKXB5KTRDKSEjOiQiMSdHYzgpPXNgciEjPDckJCIxWiRwUVorJypRKSEjOiQiMWJJWkhoXERsISM8NyQkIjEjUnljOGlZYSkhIzokIjFvUy8mR1BIdSYhIzw3JCQiMWM2QllyMChvKSEjOiQiMmw6OCEqbyUzSFwhIz03JCQiMV4rLC0lXDElKSkhIzokIjJ1WCdvVUs9clIhIz03JCQiMU9zVyplKT0rISohIzokIjI8WFZIU2xRIkghIz03JCQiMUZiNUB6MVIiKiEjOiQiL1YuJz1sSyc+ISM6NyQkIjEsLC0vOTEqRyohIzokIjE3Kj5hJSk9RkYqISM9NyQkIjBzVihbJD5TVyohIzkkITInUWUjcHN5cEgiISM+NyQkIjFlO0xtYWgmZiohIzokITEqKVJWblEiejciISM8NyQkIjFEXi0wREhVKCohIzokITIjXChlJTRKOVM/ISM9NyQkIjBzVihbQjowKiohIzkkITI6LSZvYzwxcUghIz03JCQiMlghND07KlteKyIhIzokITEuMlJ5IVtYciQhIzw3JCQiMj5Pc1dcdDItIiEjOiQhMVFhejVDPipSJSEjPDckJCIyb090WW9KXC4iISM6JCExMkNaQmMnMyJcISM8NyQkIjJlOkppSzUvMCIhIzokITJEUHY9KEdMVmAhIz03JCQiMjpIZTtfdVwxIiEjOiQhMSp5eShRbShRaSYhIzw3JCQiMi4wNT9UJ2VzNSEjOiQhMTZEeUtmej9kISM8NyQkIjE0PU8tJCk+ITMiISM5JCEyazJfIm8+WCR5JiEjPTckJCIyeGAybEpTdzMiISM6JCEyTkclSGllcTZlISM9NyQkIjJrRWAxTCMzJjQiISM6JCEyWGZPYCM+aTJlISM9NyQkIjIlcFF4SE0oRzUiISM6JCExQHQ4NDA/cGQhIzw3JCQiMkNaJSopR1htNTYhIzokITIxISplLGlobHAmISM9NyQkIjJaJSopeVA/bkQ2ISM6JCExV1YqSCdRcmphISM8NyQkIjIvMztLUT41OSIhIzokITFBYV85M2wxXiEjPDckJCIxc1YoW2tSaToiISM5JCEybElxSkMkKVtrJSEjPTckJCIyYzZCWVtELTwiISM6JCEyJj0kcD1xWnQ4JSEjPTckJCIyPVF3XyRbRCc9IiEjOiQhMXU3eTNhJUhaJCEjPDckJCIyKFJ6ZXg7Zis3ISM6JCExVlhVWixvPUchIzw3JCQiMSV6ZTx1eGVAIiEjOSQhMUIlXHF6NGIyIyEjPDckJCIyMzlHY1gzMEIiISM6JCEyMSFvTSEqKm9rTCIhIz03JCQiMXliNiQpUnZZNyEjOSQhMSYpM14rU0lRXSEjPTckJCIyZTpKaVRAM0UiISM6JCIyampaREVuQDYjISM+NyQkIjE7S2t5ISl5dzchIzkkIjFbKGU+RFgneioqISM9NyQkIjJCWCE0ZSpSOEgiISM6JCIyJ3o9TWY1cHc7ISM9NyQkIjFLa0dGdUQyOCEjOSQiMiVlQEEybEBoQiEjPTckJCIyOkdjN14iKjRLIiEjOiQiMlVnISlHYUA8KkchIz03JCQiMlB1WyhISWpPOCEjOiQiMD4iW3RQYDtNISM7NyQkIjIwNkFXJz51XjghIzokIjFicCYqKnBgUCRRISM8NyQkIjIpcFJ6RzUlb08iISM6JCIxTT8jPkIoPWJUISM8NyQkIjIzO0trYSUpPVEiISM6JCIxdyV5Z3FhYVAlISM8NyQkIjJNb090bE9qUiIhIzokIjBzOWs2RzBcJSEjOzckJCIxKnpmPnhmPlQiISM5JCIxRyI0LEByITNYISM8NyQkIjJgMjpJdFxvVSIhIzokIjBvJXB4UEhCVyEjOzckJCIxKFJ6ZXI/RFciISM5JCIxUj1dRi5WSlUhIzw3JCQiMmhBWCFIbnFjOSEjOiQiMEYuR3kvRShSISM7NyQkIjI3QlkjSFxRczkhIzokIjEiZmxSdUQyZyQhIzw3JCQiMmAyOkkiPlMoWyIhIzokIjI7QFY7cnMocEohIz03JCQiMmQ3RF1NI1EtOiEjOiQiMic0X2YnM20heUUhIz03JCQiMiIzO0trJUghPTohIzokIjFgKzpPaGk2QCEjPDckJCIyLjE3Qy5UQ2AiISM6JCIyOHMpM11vZ2E6ISM9NyQkIjJpQlolXC8/WjohIzokIjFjaU1aJlwhPicqISM9NyQkIjIqKil6ZipmJ1xqOiEjOiQiMjhbI0diO2twSCEjPjckJCIyJz1QdUc5RHk6ISM6JCEyJClSTEQsI1EvSSEjPjckJCIyPVF3XytUTGYiISM6JCExOGNQIlE/OyQqKSEjPTckJCIxWydIZnInbzM7ISM5JCEyJHBGJSoqM1pRWSIhIz03JCQiMTA1PzVDekE7ISM5JCEydiY9IWZFQSJcPiEjPTckJCIyeWU8TmlHeWoiISM6JCExT11JNy91OUMhIzw3JCQiMTA1PyFRXUZsIiEjOSQhL2J5LiF6XSJHISM6NyQkIjAvMzstNyhvOyEjOCQhMidbS09XYGVtSiEjPTckJCIydlkkcHl1eiNvIiEjOiQhMk9SXiIqWyM+ME0hIz03JCQiMS8zO3MiXCEqcCIhIzkkITInKkhvTWY2QmYkISM9NyQkIjE5R2NzXXI4PCEjOSQhMSdHIT1CcW14TyEjPDckJCIyMjZBV0BFI0c8ISM6JCExQiZlUVBQT28kISM8NyQkIjI8TW9PTklRdSIhIzokITE4cj4rTUwvTyEjPDckJCIxc1YoW2goXGY8ISM5JCEyRF5jWkMnelFNISM9NyQkIjIjPlF3LUR2dDwhIzokITInZW0hbzcpKnpAJCEjPTckJCIyRV4tMGMhKikpeSIhIzokITIyIm9GJzQ8bSJIISM9NyQkIjJLakVgI1FtLj0hIzokITJNJ2UoKkghR05jIyEjPTckJCIyakReLT95Jz49ISM6JCEyZFNWYyoqelw3IyEjPTckJCIxd14uKDNOTiQ9ISM5JCEwRm4qZkJzMjwhIzs3JCQiMSNRd19BXSVcPSEjOSQhMk4kPT1pRGwnPiIhIz03JCQiMnhhND5INlcnPSEjOiQhMSZSNklfIXpscCEjPTckJCIxdVomNCZ5QXo9ISM5JCEyLSoqZiJmcUlSPiEjPjckJCIxPE1vJz5jUyo9ISM5JCIyL0xpQXJDWTAkISM+NyQkIjJ4Xi4yPCE9ND4hIzokIjEoR2Y6O2YqKSp6ISM9NyQkIjEmKiopekg4QEQ+ISM5JCIyLyF5VyMpXFwmSCIhIz03JCQiMj1La0dMNSpSPiEjOiQiMlgrJUdeWS45PCEjPTckJCIxZTtMTyxVYT4hIzkkIjFHVkRGOzEmMyMhIzw3JCQiMmU9UHUoMyQqcD4hIzokIjIlR3VrVl1QRkMhIz03JCQiMmIyOkkmeVMmKT4hIzokIjFDQ1ohM3pmcSMhIzw3JCQiJCsjISIiJCIxTTleKSlcKmYhSCEjPC0lJ0xFR0VOREc2Iy0lKV9UWVBFU0VURzYjUSJLNiItJSZDT0xPUkc2JyUkUkdCRyQiIiEhIiIkIignPiFcJiEiKSQiKUMpZXElISIpLSUrX0FUVFJJQlVURUc2Iy8lJ3NvdXJjZUclLG1hdGhkZWZhdWx0Ry0lJVZJRVdHNiQ7JCEkKyIhIiIkIiQrIyEiIiUoREVGQVVMVEctJiUmX0FYSVNHNiMiIiI2Ji0lJkNPTE9SRzYmJSRSR0JHJCIiISEiIiQiIiEhIiIkIiIhISIiLSUqTElORVNUWUxFRzYjIiIhLSUqVEhJQ0tORVNTRzYjIiIhLSUtVFJBTlNQQVJFTkNZRzYjJCIiISEiIi0mJSZfQVhJU0c2IyIiIzYmLSUmQ09MT1JHNiYlJFJHQkckIiIhISIiJCIiISEiIiQiIiEhIiItJSpMSU5FU1RZTEVHNiMiIiEtJSpUSElDS05FU1NHNiMiIiEtJS1UUkFOU1BBUkVOQ1lHNiMkIiIhISIiLSUrQVhFU0xBQkVMU0c2JC1JI21pRzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliRzYiNjZRIng2Ii8lJ2ZhbWlseUdRITYiLyUlc2l6ZUdRIzEwNiIvJSVib2xkR1EmZmFsc2U2Ii8lJ2l0YWxpY0dRJXRydWU2Ii8lKnVuZGVybGluZUdRJmZhbHNlNiIvJS5zdHJpa2V0aHJvdWdoR1EmZmFsc2U2Ii8lKnN1YnNjcmlwdEdRJmZhbHNlNiIvJSxzdXBlcnNjcmlwdEdRJmZhbHNlNiIvJStmb3JlZ3JvdW5kR1EoWzAsMCwwXTYiLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV02Ii8lJ29wYXF1ZUdRJmZhbHNlNiIvJStleGVjdXRhYmxlR1EmZmFsc2U2Ii8lKXJlYWRvbmx5R1EmZmFsc2U2Ii8lKWNvbXBvc2VkR1EmZmFsc2U2Ii8lKmNvbnZlcnRlZEdRJmZhbHNlNiIvJStpbXNlbGVjdGVkR1EmZmFsc2U2Ii8lLHBsYWNlaG9sZGVyR1EmZmFsc2U2Ii8lNnNlbGVjdGlvbi1wbGFjZWhvbGRlckdRJmZhbHNlNiIvJSxtYXRodmFyaWFudEdRJ2l0YWxpYzYiUSE2Ii0lKV9WSVNJQkxFRzYjIiIiLSUlUk9PVEc2Jy0lKUJPVU5EU19YRzYjJCIiISEiIi0lKUJPVU5EU19ZRzYjJCIiISEiIi0lLUJPVU5EU19XSURUSEc2IyQiJStdISIiLSUuQk9VTkRTX0hFSUdIVEc2IyQiJStdISIiLSUpQ0hJTERSRU5HNiItJStBTk5PVEFUSU9ORzYnLSUpQk9VTkRTX1hHNiMkIiIhISIiLSUpQk9VTkRTX1lHNiMkIiIhISIiLSUtQk9VTkRTX1dJRFRIRzYjJCIlK10hIiItJS5CT1VORFNfSEVJR0hURzYjJCIlK10hIiItJSlDSElMRFJFTkc2Ig==Ig== @@ -848,7 +848,7 @@ -JSFH +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYjLUkjbWlHRiQ2I1EhRic= @@ -1088,7 +1088,7 @@ -JSFH +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYjLUkjbWlHRiQ2I1EhRic= @@ -1103,8 +1103,34 @@ LV9JLFR5cGVzZXR0aW5nRzYkJSpwcm90ZWN0ZWRHSShfc3lzbGliRzYiSSxtcHJpbnRzbGFzaEdGKDYkNyM+SSdsYW1iZGFHRihmKjYjSSJrR0YoRig2JEkpb3BlcmF0b3JHRihJJmFycm93R0YoRigsJCosIyIiIiIiI0Y3KSwmKiYiIiVGN0YwRjdGN0Y3RjdGNkY3KUkjUGlHRiZGNiEiIiktSSZHQU1NQUdGJTYjLCZGMEY3RjZGN0Y4RjcpLUZCNiMsJkYwRjdGN0Y3RjhGP0Y3RihGKEYoNyNGLg== - -JSFH + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYpLUkjbWlHRiQ2I1EhRictRiM2LC1GLDYlUSkmbGFtYmRhO0YnLyUnaXRhbGljR1EmZmFsc2VGJy8lLG1hdGh2YXJpYW50R1Enbm9ybWFsRictSSNtb0dGJDYtUSkmQXNzaWduO0YnRjcvJSZmZW5jZUdGNi8lKnNlcGFyYXRvckdGNi8lKXN0cmV0Y2h5R0Y2LyUqc3ltbWV0cmljR0Y2LyUobGFyZ2VvcEdGNi8lLm1vdmFibGVsaW1pdHNHRjYvJSdhY2NlbnRHRjYvJSdsc3BhY2VHUSwwLjI3Nzc3NzhlbUYnLyUncnNwYWNlR0ZOLUYsNiVRImtGJy9GNVEldHJ1ZUYnL0Y4USdpdGFsaWNGJy1GOzYtUSYmbWFwO0YnRjdGPkZAL0ZDRlVGREZGRkhGSkZMRk8tSSZtZnJhY0dGJDYoLUYjNiotSSZtc3FydEdGJDYjLUYjNiotRiM2Ki1JI21uR0YkNiRRIjRGJ0Y3LUY7Ni1RJyZzZG90O0YnRjdGPkZARkJGREZGRkhGSi9GTVEmMC4wZW1GJy9GUEZqb0ZRLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJStleGVjdXRhYmxlR0Y2LyUpcmVhZG9ubHlHRlUvJTBmb250X3N0eWxlX25hbWVHUSoyRH5PdXRwdXRGJ0Y3LUY7Ni1RJyZwbHVzO0YnRjdGPkZARkJGREZGRkhGSi9GTVEsMC4yMjIyMjIyZW1GJy9GUEZqcC1GY282JFEiMUYnRjdGXHBGX3BGYXBGY3BGN0Zmby1JJW1zdXBHRiQ2JS1GIzYqLUYsNiVRKCZHYW1tYTtGJ0Y0RjctRjs2LVEwJkFwcGx5RnVuY3Rpb247RidGN0Y+RkBGQkZERkZGSEZKRmlvRltwLUkobWZlbmNlZEdGJDYkLUYjNipGUUZmcC1GZ242KEZccS1GY282JFEiMkYnRjcvJS5saW5ldGhpY2tuZXNzR0ZecS8lK2Rlbm9tYWxpZ25HUSdjZW50ZXJGJy8lKW51bWFsaWduR0Zoci8lKWJldmVsbGVkR0Y2RlxwRl9wRmFwRmNwRjdGN0ZccEZfcEZhcEZjcEY3RmFyLyUxc3VwZXJzY3JpcHRzaGlmdEdRIjBGJ0ZccEZfcEZhcEZjcEY3LUYjNixGYXJGZm8tRlxvNiMtRiw2JVElJnBpO0YnRjRGN0Zmby1GYHE2JS1GIzYqRmRxRmdxLUZbcjYkLUYjNipGUUZmcEZccUZccEZfcEZhcEZjcEY3RjdGXHBGX3BGYXBGY3BGN0ZhckZdc0ZccEZfcEZhcEZjcEY3RmRyRmZyRmlyRltzRlxwRl9wRmFwRmNwRjdGK0ZccC8lJXNpemVHUSMxMkYnRl9wRjc= + +LV9JLFR5cGVzZXR0aW5nRzYkJSpwcm90ZWN0ZWRHSShfc3lzbGliRzYiSSxtcHJpbnRzbGFzaEdGKDYkNyM+SSdsYW1iZGFHRihmKjYjSSJrR0YoRig2JEkpb3BlcmF0b3JHRihJJmFycm93R0YoRigsJCoqLUklc3FydEdGJTYjLCY5JCIiJSIiIkY8RjwtSSZHQU1NQUdGJTYjLCZGOkY8I0Y8IiIjRjxGQi1GNzYjSSNQaUdGJiEiIi1GPjYjLCZGOkY8RjxGPCEiI0ZBRihGKEYoNyNGLg== + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2JVEmbGltaXRGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSShtZmVuY2VkR0YkNiQtRiM2LC1GLDYjUSFGJy1GIzYrLUYsNiVRJ2xhbWJkYUYnL0YwUSZmYWxzZUYnL0YzUSdub3JtYWxGJy1JJW1zdXBHRiQ2JS1GNjYkLUYjNictRiw2JVEia0YnRi9GMi8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYnLyUlc2l6ZUdRIzEyRicvJStleGVjdXRhYmxlR0ZDRkRGRC1GIzYlRjpGL0YyLyUxc3VwZXJzY3JpcHRzaGlmdEdRIjBGJy1JI21vR0YkNi1RKCZtaW51cztGJ0ZELyUmZmVuY2VHRkMvJSpzZXBhcmF0b3JHRkMvJSlzdHJldGNoeUdGQy8lKnN5bW1ldHJpY0dGQy8lKGxhcmdlb3BHRkMvJS5tb3ZhYmxlbGltaXRzR0ZDLyUnYWNjZW50R0ZDLyUnbHNwYWNlR1EsMC4yMjIyMjIyZW1GJy8lJ3JzcGFjZUdGW3AtRiM2JUY/LUZHNiUtRjY2JC1GIzYmRk0tRmhuNi1RIitGJ0ZERltvRl1vRl9vRmFvRmNvRmVvRmdvRmlvRlxwLUkjbW5HRiQ2JFEiMUYnRkRGREZERlhGWkZERjpGUEZTRlZGRC1GaG42LVEiLEYnRkRGW28vRl5vRjFGX29GYW9GY29GZW9GZ28vRmpvUSYwLjBlbUYnL0ZdcFEsMC4zMzMzMzMzZW1GJ0ZNLUZobjYtUSI9RidGREZbb0Zdb0Zfb0Zhb0Zjb0Zlb0Znby9Gam9RLDAuMjc3Nzc3OGVtRicvRl1wRmlxLUYsNiVRKWluZmluaXR5RidGQkZERlBGU0ZWRkRGREZQRlNGVkZE + +IiIh + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYuLUkjbWlHRiQ2JVEkc3VtRicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUkobWZlbmNlZEdGJDYkLUYjNjEtRiw2JVEnbGFtYmRhRicvRjBRJmZhbHNlRicvRjNRJ25vcm1hbEYnLUY2NiQtRiM2Jy1GLDYlUSJrRidGL0YyLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lK2V4ZWN1dGFibGVHRj5GP0Y/LUkjbW9HRiQ2LVEoJm1pbnVzO0YnRj8vJSZmZW5jZUdGPi8lKnNlcGFyYXRvckdGPi8lKXN0cmV0Y2h5R0Y+LyUqc3ltbWV0cmljR0Y+LyUobGFyZ2VvcEdGPi8lLm1vdmFibGVsaW1pdHNHRj4vJSdhY2NlbnRHRj4vJSdsc3BhY2VHUSwwLjIyMjIyMjJlbUYnLyUncnNwYWNlR0Zeb0Y6LUY2NiQtRiM2KUZFRlAtSSNtbkdGJDYkUSIxRidGP0ZIRktGTkY/Rj8tRlE2LVEiLEYnRj9GVC9GV0YxRlhGWkZmbkZobkZqbi9GXW9RJjAuMGVtRicvRmBvUSwwLjMzMzMzMzNlbUYnRkUtRlE2LVEiPUYnRj9GVEZWRlhGWkZmbkZobkZqbi9GXW9RLDAuMjc3Nzc3OGVtRicvRmBvRmVwLUZmbzYkUSIwRidGPy1GUTYtUSMuLkYnRj9GVEZWRlhGWkZmbkZobkZqbkZcby9GYG9GXnAtRiw2JVEibkYnRi9GMkZIRktGTkY/Rj9GYXBGOi1GNjYkLUYjNidGXnFGSEZLRk5GP0Y/LUZRNi1RIjtGJ0Y/RlRGXHBGWEZaRmZuRmhuRmpuRl1wRmZwLUYsNiVRI2lzRidGL0YyLUY2NiQtRiM2Jy1GLDYlUSIlRidGL0YyRkhGS0ZORj9GP0ZIRktGTkY/ + +LywkKiosJkkibkc2IiIiJSIiIkYpI0YpIiIjLUkmR0FNTUFHNiQlKnByb3RlY3RlZEdJKF9zeXNsaWJHRic2IywmRiZGKUYqRilGK0kjUGlHRi8jISIiRistRi02IywmRiZGKUYpRikhIiNGKkYj + +SSV0cnVlRyUqcHJvdGVjdGVkRw== + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2JVEmbGltaXRGJy8lJ2l0YWxpY0dRJXRydWVGJy8lLG1hdGh2YXJpYW50R1EnaXRhbGljRictSShtZmVuY2VkR0YkNiQtRiM2Ky1JJm1mcmFjR0YkNigtRiM2Ky1GLDYlUSRleHBGJy9GMFEmZmFsc2VGJy9GM1Enbm9ybWFsRictRjY2JC1GIzYnLUYsNiVRImtGJ0YvRjIvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GJy8lJXNpemVHUSMxMkYnLyUrZXhlY3V0YWJsZUdGQ0ZERkQtSSNtb0dGJDYtUScmc2RvdDtGJ0ZELyUmZmVuY2VHRkMvJSpzZXBhcmF0b3JHRkMvJSlzdHJldGNoeUdGQy8lKnN5bW1ldHJpY0dGQy8lKGxhcmdlb3BHRkMvJS5tb3ZhYmxlbGltaXRzR0ZDLyUnYWNjZW50R0ZDLyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdGY29GPy1GNjYkLUYjNictSSNtbkdGJDYkUSIxRidGREZNRlBGU0ZERkRGTUZQRlNGRC1GIzYmRj8tRjY2JC1GIzYnRkotRlY2LVEiK0YnRkRGWUZlbkZnbkZpbkZbb0Zdb0Zfby9GYm9RLDAuMjIyMjIyMmVtRicvRmVvRmhwRmpvRi9GMkZERi9GMi8lLmxpbmV0aGlja25lc3NHRl1wLyUrZGVub21hbGlnbkdRJ2NlbnRlckYnLyUpbnVtYWxpZ25HRl5xLyUpYmV2ZWxsZWRHRkMtRlY2LVEiLEYnRkRGWS9GZm5GMUZnbkZpbkZbb0Zdb0Zfb0Zhby9GZW9RLDAuMzMzMzMzM2VtRidGSi1GVjYtUSI9RidGREZZRmVuRmduRmluRltvRl1vRl9vL0Zib1EsMC4yNzc3Nzc4ZW1GJy9GZW9GXXItRiw2JVEpaW5maW5pdHlGJ0ZCRkRGTUZQRlNGREZERk1GUEZTRkQ= + +IiIi + + + +LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYnLUkjbW9HRiQ2LVEifkYnLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGNC8lKXN0cmV0Y2h5R0Y0LyUqc3ltbWV0cmljR0Y0LyUobGFyZ2VvcEdGNC8lLm1vdmFibGVsaW1pdHNHRjQvJSdhY2NlbnRHRjQvJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0ZDLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lK2V4ZWN1dGFibGVHRjRGLw== \ No newline at end of file diff --git a/src/main/java/arb/expressions/Expression.java b/src/main/java/arb/expressions/Expression.java index c84774184..30af63193 100644 --- a/src/main/java/arb/expressions/Expression.java +++ b/src/main/java/arb/expressions/Expression.java @@ -383,15 +383,6 @@ protected void addChecksForNullVariableReferences(MethodVisitor mv) } } - /** - * Calls this{@link #newIntermediateVariable(Class)} followed by - * this{@link #loadThisFieldOntoStack(MethodVisitor, String, Class)} with the - * newly assigned intermediate variable - * - * @param methodVisitor - * @param type - * @return - */ public String allocateIntermediateVariable(MethodVisitor methodVisitor, Class type) { assert !type.isInterface() : "cannot instantiate interface " + type; @@ -608,19 +599,6 @@ protected Class defineClass() return compiledClass = loadFunctionClass(className, instructionByteCodes, context); } - /** - * Process the next character - * - * @return a parenthetical {@link Node}, a {@link ProductNode}, a - * {@link LiteralConstantNode},a {@link Function}, a - * {@link VariableNode} or null if for instance "-t" is encountered, as - * a 0 is implied by the absence of a node before the - * {@link SubtractionNode} operator is encountered, also handles - * {@link ProductNode} also known as the product operator and - * {@link SumNode} - * - * @throws CompilerException - */ @SuppressWarnings("unchecked") public > N evaluate() throws CompilerException { @@ -674,12 +652,6 @@ protected Node evaluateIndex() return index == null ? index = evaluateSubscriptedIndex() : index; } - /** - * - * @param startPos - * @return a new {@link VariableReference} constructed from the results of - * calling this{@link #parseName()} and this{@link #evaluateIndex()} - */ protected VariableReference evaluateName(int startPos) { String identifier = parseName(startPos); @@ -688,12 +660,6 @@ protected VariableReference evaluateName(int startPos) index); } - /** - * - * @return a new {@link LiteralConstantNode} constucted by iterating - * this{@link #nextCharacter()} while {@link Parser#isNumeric(char)} - * applied to this{@link #character} is true - */ protected Node evaluateNumber() { int startingPosition = position; @@ -1647,19 +1613,6 @@ public String newIntermediateVariable(String prefix, Class type) return newIntermediateVariable(prefix, type, true); } - /** - * Assigns the next field name in the sequence for the given variable name - * prefix by calling - * this{@link #getNextIntermediateVariableFieldName(String, Class)} then passing - * the result to this{@link #registerIntermediateVariable(String, Class)} - * - * @param prefix - * @param type - * @param initialize if true then "this.field=new FieldType()" is generated - * otherwise its not - * - * @return the variable name assigned - */ public String newIntermediateVariable(String prefix, Class type, boolean initialize) { assert prefix != null : "name shan't be null"; @@ -1803,16 +1756,6 @@ public boolean references(VariableReference reference) return referencedVariables.containsKey(reference.name); } - /** - * {@link Node}s can call this to register a {@link Consumer} of - * {@link MethodVisitor} to have its {@link Consumer#accept(Object)} method - * called during the declaration of the body of the {@link Initializable} - * interface method implementation {@link Initializable#initialize()} of the - * {@link Function} being generated by this {@link Expression} - * - * @param consumer - * @return - */ public Expression registerInitializer(Consumer consumer) { initializers.add(consumer); @@ -2314,3 +2257,4 @@ public LiteralConstantNode newLiteralConstant(int i) } } + diff --git a/src/main/java/arb/expressions/Expression.java~ b/src/main/java/arb/expressions/Expression.java~ deleted file mode 100644 index 4b972c93b..000000000 --- a/src/main/java/arb/expressions/Expression.java~ +++ /dev/null @@ -1,1409 +0,0 @@ -package arb.expressions; - -import static arb.expressions.Compiler.addNullCheckForField; -import static arb.expressions.Compiler.checkClassCast; -import static arb.expressions.Compiler.generateFunctionInterface; -import static arb.expressions.Compiler.getVariablePrefix; -import static arb.expressions.Compiler.invokeSetMethod; -import static arb.expressions.Compiler.loadFunctionClass; -import static arb.expressions.Compiler.loadResultParameter; -import static arb.expressions.Compiler.loadThisOntoStack; -import static arb.expressions.Compiler.reify; -import static arb.expressions.Parser.isLatinOrGreek; -import static arb.expressions.Parser.isNumeric; -import static java.lang.String.format; -import static java.util.stream.Collectors.toList; -import static org.objectweb.asm.Opcodes.ACC_FINAL; -import static org.objectweb.asm.Opcodes.ACC_PUBLIC; -import static org.objectweb.asm.Opcodes.ALOAD; -import static org.objectweb.asm.Opcodes.GETFIELD; -import static org.objectweb.asm.Opcodes.INVOKESPECIAL; -import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL; -import static org.objectweb.asm.Opcodes.PUTFIELD; -import static org.objectweb.asm.Opcodes.RETURN; - -import java.io.File; -import java.io.IOException; -import java.lang.reflect.Method; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.Label; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.Type; -import org.objectweb.asm.signature.SignatureWriter; - -import arb.ComplexPolynomial; -import arb.Integer; -import arb.OrderedPair; -import arb.RealPolynomial; -import arb.Typesettable; -import arb.exceptions.ExpressionCompilerException; -import arb.expressions.nodes.LiteralConstant; -import arb.expressions.nodes.Node; -import arb.expressions.nodes.Variable; -import arb.expressions.nodes.binary.Addition; -import arb.expressions.nodes.binary.Division; -import arb.expressions.nodes.binary.Exponentiation; -import arb.expressions.nodes.binary.Multiplication; -import arb.expressions.nodes.binary.RisingFactorial; -import arb.expressions.nodes.binary.Subtraction; -import arb.expressions.nodes.nary.Product; -import arb.expressions.nodes.unary.Factorial; -import arb.expressions.nodes.unary.FunctionCall; -import arb.expressions.nodes.unary.When; -import arb.functions.Function; -import arb.utensils.Utensils; - -/** - *

- * The Expression class in the arb.expressions package - * is a versatile and dynamic expression {@link Compiler} which produces - * high-performance {@link Function} implementations instantly using ASM's - * {@link MethodVisitor} and {@link ClassVisitor} for bytecode generation. - * - *

Key features

- *
    - *
  • Compiles mathematical expressions dynamically into Java bytecodes.
  • - *
  • Manages variables, constants, and function calls within expressions.
  • - *
  • Handles intermediate variables and constants effectively.
  • - *
  • Injects variable and function references into compiled instances.
  • - *
  • Includes methods for parsing, evaluating, and generating necessary - * bytecode for expressions.
  • - *
- * - * TODO: sum ⅀, factorial and Γ function - * - *

System Properties

- *
    - *
  • expressionCompiler.saveClasses=true|false
  • - *
- * - * arb4j is made available under the terms of the Business Source License™ v1.1 - * ©2024 which can be found in the root directory of this project in a file - * named License.pdf, License.txt, or License.tm which are the pdf, text, and - * TeXmacs formatted versions of the same document respectively. - * - * @param domain type - * @param range type - * @param the function type of the expression, extending {@link Function} - * - * @author ©2024 Stephen A. Crowley - */ -public class Expression> implements - Typesettable -{ - - public static final String evaluationMethodDescriptor = "(Ljava/lang/Object;IILjava/lang/Object;)Ljava/lang/Object;"; - - private static final String IS_INITIALIZED = "isInitialized"; - - private static final String nameOfInitializerFunction = "initialize"; - - public static boolean saveClasses = Boolean.valueOf(System.getProperty("expressionCompiler.saveClasses", - "false")); - - public static > F instantiate(String expression, - Context context, - Class domainClass, - Class rangeClass, - Class functionClass, - String functionName) - { - FunctionMapping mapping = null; - if (functionName != null) - { - mapping = context.registerFunctionMapping(functionName, null, domainClass, rangeClass, functionClass); - } - - Expression compiledExpression = reify(expression, - context, - domainClass, - rangeClass, - functionClass, - functionName); - F func = compiledExpression.instantiate(); - if (mapping != null) - { - mapping.func = func; - } - - return func; - } - - /** - * {@link Compiler#reify(String, String, Context, Class, Class, Class, boolean)}s - * then {@link Expression#instantiate()}s a mathematical expressions - * - * @param - * @param - * @param - * @param className - * @param expression - * @param context - * @param domainClass - * @param rangeClass - * @param functionClass - * @param verbose - * @return - */ - public static > F instantiate(String className, - String expression, - Context context, - Class domainClass, - Class rangeClass, - Class functionClass, - boolean verbose) - { - return reify(className, expression, context, domainClass, rangeClass, functionClass, verbose).instantiate(); - } - - public char character = 0; - - public boolean checkForNullsBeforeEvaluating = false; - - public String className; - - Class compiledClass; - - int constantCount = 1; - - public Context context; - - final public String domainClassDescriptor; - - public final String domainClassInternalName; - - final public Class domainType; - - protected Method evaluateMethod; - - public final String evaluateMethodSignature; - - public String expression; - - public Class functionClass; - - public String functionClassDescriptor; - - public String functionName; - - final public String genericFunctionClassInternalName; - - public Variable independentVariableNode; - - public Variable indeterminate; - - F instance; - - protected byte[] instructions; - - public HashMap intermediateVariableCounters = new HashMap<>(); - - public ArrayList> intermediateVariables = new ArrayList<>(); - - public ArrayList> literalConstants = new ArrayList<>(); - - public int position = -1; - - public char previousCharacter; - - final public String rangeClassDescriptor; - - public final String rangeClassInternalName; - - final public Class rangeType; - - public boolean recursive = false; - - public HashMap> referencedFunctions = new HashMap<>(); - - public HashMap> referencedVariables = new HashMap<>(); - - public Node rootNode; - - public Variables variables; - - public boolean variablesDeclared = false; - - public Expression(String className, - Class domainClass, - Class rangeClass, - Class functionClass, - String expressionString, - Context context) - { - this(className, - domainClass, - rangeClass, - functionClass, - expressionString, - context, - null); - } - - public Expression(String className, - Class domainClass, - Class rangeClass, - Class functionClass, - String expression, - Context context, - String functionName) - { - this.rangeClassDescriptor = rangeClass.descriptorString(); - this.domainClassDescriptor = domainClass.descriptorString(); - this.className = className; - this.domainType = domainClass; - this.rangeType = rangeClass; - this.functionClass = functionClass; - this.rangeClassInternalName = Type.getInternalName(rangeClass); - this.domainClassInternalName = Type.getInternalName(domainClass); - this.genericFunctionClassInternalName = Type.getInternalName(functionClass); - this.functionClassDescriptor = functionClass.descriptorString(); - this.expression = Parser.replaceArrowsAndEllipses(expression); - this.context = context; - this.variables = context != null ? context.variables : null; - evaluateMethodSignature = String.format("(L%s;IIL%s;)L%s;", - domainClassInternalName, - rangeClassInternalName, - rangeClassInternalName); - this.functionName = functionName; - if (context != null && context.saveClasses) - { - saveClasses = true; - } - } - - public Node addAndSubtract(Node node) - { - while (true) - { - - if (nextCharacterIs('+', '₊')) - { - node = new Addition<>(this, - node, - exponentiateMultiplyAndDivide()); - } - else if (nextCharacterIs('-', '₋')) - { - node = new Subtraction<>(this, - node, - exponentiateMultiplyAndDivide()); - } - - else - { - return node; - } - } - } - - public void addCheckForNullField(MethodVisitor methodVisitor, String varName, boolean variable) - { - Class fieldClass = variable ? context.variables.map.get(varName).getClass() : context.functions.get(varName) - .type(); - String fieldDesc = fieldClass.descriptorString(); - addNullCheckForField(methodVisitor, className, varName, fieldDesc); - } - - public void addChecksForNullVariableReferences(MethodVisitor mv, boolean all, boolean that) - { - if (context != null) - { - for (var variable : all ? context.variables.map.keySet() : referencedVariables.keySet()) - { - mv.visitVarInsn(Opcodes.ALOAD, that ? 1 : 0); - addCheckForNullField(mv, variable, true); - } - } - } - - public MethodVisitor - callContextualUnaryFunction(MethodVisitor methodVisitor, FunctionMapping mapping, Class type) - { - boolean isInterface = mapping.functionInterface != null; - methodVisitor.visitMethodInsn(mapping.functionInterface != null ? Opcodes.INVOKEINTERFACE : Opcodes.INVOKEVIRTUAL, - Type.getInternalName(isInterface ? mapping.functionInterface : mapping.func.getClass()), - "evaluate", - evaluationMethodDescriptor, - isInterface); - return Compiler.checkClassCast(methodVisitor, type); - } - - public ClassVisitor constructClassVisitor() - { - ClassVisitor cw = new ClassWriter(false ? ClassWriter.COMPUTE_FRAMES : 0 ); - return cw; - } - - public ClassVisitor declareConstants(ClassVisitor classVisitor) - { - for (var constant : literalConstants) - { - constant.declareField(classVisitor); - } - return classVisitor; - } - - public void declareFields(ClassVisitor cw) - { - if (needsInitializer()) - { - cw.visitField(Opcodes.ACC_PRIVATE, IS_INITIALIZED, "Z", null, null); - } - - declareConstants(cw); - - declareVariables(cw); - - declareIntermediateVariables(cw); - - declareFunctionReferences(cw); - - } - - public void declareFunctionReference(ClassVisitor classVisitor, String name, FunctionMapping function) - { - String descriptor = "L" + function.name + ";"; - classVisitor.visitField(ACC_PUBLIC - | (function.name.equals(functionName) ? 0 : ACC_FINAL), name, descriptor, null, null); - } - - public ClassVisitor declareFunctionReferences(ClassVisitor classVisitor) - { - if (context != null) - { - referencedFunctions.forEach((name, function) -> declareFunctionReference(classVisitor, name, function)); - } - return classVisitor; - } - - public void declareIntermediateVariables(ClassVisitor classVisitor) - { - for (var variable : intermediateVariables) - { - variable.declareField(classVisitor); - } - } - - public MethodVisitor declareLocalVariables(MethodVisitor methodVisitor, Label startLabel, Label endLabel) - { - methodVisitor.visitLocalVariable("in", domainType.descriptorString(), null, startLabel, endLabel, 1); - methodVisitor.visitLocalVariable("order", "I", null, startLabel, endLabel, 2); - methodVisitor.visitLocalVariable("bits", "I", null, startLabel, endLabel, 3); - methodVisitor.visitLocalVariable("result", rangeType.descriptorString(), null, startLabel, endLabel, 4); - return methodVisitor; - } - - public void declareVariables(ClassVisitor classVisitor) - { - if (context != null) - { - for (var variable : context.variables.map.entrySet()) - { - classVisitor.visitField(ACC_PUBLIC, - variable.getKey(), - variable.getValue().getClass().descriptorString(), - null, - null); - } - } - - variablesDeclared = true; - } - - public Class load() - { - assert instructions != null : "the instructions field is null indicating that the expression has not been compiled"; - return compiledClass = loadFunctionClass(className, instructions, context); - } - - /** - * Apply the order of operations except for parenthesis - * - * @return the result of passing this{@link #exponentiateMultiplyAndDivide()} to - * this{@link #addAndSubtract(Node)} - */ - public Node determine() - { - Node node = exponentiateMultiplyAndDivide(); - return addAndSubtract(node); - } - - /** - * @return a parenthetical {@link Node}, a {@link Product}, a - * {@link LiteralConstant},a {@link Function}, a {@link Variable} or - * null if for instance "-t" is encountered, a 0 is implied by the - * abscence of a node before the {@link Subtraction} operator is - * encountered - * - * @throws ExpressionCompilerException - */ - public Node evaluate() throws ExpressionCompilerException - { - Node node = null; - - int startPos = position; - - if (nextCharacterIs('(')) - { - node = determine(); - - if (!nextCharacterIs(')')) - { - throw new ExpressionCompilerException(format("expected closing parenthesis, instead " - + "got %c at position %s in " + "expression '%s' node=%s which is fllowed by %s ", - character, - position, - expression, - node, - expression.substring(position, expression.length()))); - } - - } - else if (nextCharacterIs('Π', '∏')) - { - return new Product(this, - determine()).evaluateRangeSpecification(); - } - else if (Parser.isNumeric(character)) - { - node = evaluateNumber(startPos); - assert node != null : "parseNumber returned null"; - } - else if (Parser.isLatinOrGreek(character, false) || Parser.isAlphaNumericSubscript(character)) - { - node = resolveFunctionOrVariableReference(startPos); - assert node != null : "parseFunctionInvocationOrVariableReference returned null"; - } - - node = resolvePostfixOperators(node); - return node; - } - - private VariableReference evaluateName(int startPos) - { - String identifier = parseName(startPos); - Node index = evaluateIndex(); - return new VariableReference(identifier, - index); - } - - private Node evaluateIndex() - { - Node index = evaluateSquareBracketedIndex(); - if (index == null) - { - index = evaluateSubscriptedIndex(); - } - return index; - } - - public Node evaluateNumber(int startPos) - { - while (isNumeric(character)) - { - nextCharacter(); - } - - return new LiteralConstant<>(this, - expression.substring(startPos, position)); - } - - public void evaluateOptionalIndependentVariableSpecification() - { - expression = expression.replace("->", "➔"); - int rightArrowIndex = expression.indexOf('➔'); - if (rightArrowIndex != -1) - { - String name = expression.substring(0, rightArrowIndex); - VariableReference reference = new VariableReference(name, - null, - domainType); - independentVariableNode = new Variable(this, - reference); - - position = rightArrowIndex; - } - } - - private Node evaluateSquareBracketedIndex() - { - Node index = null; - if (nextCharacterIs('[')) - { - index = determine(); - if (!nextCharacterIs(']')) - { - throw new ExpressionCompilerException(format("Expected closing ] at position %d in %s but got %c and the rest is %s", - position, - expression, - character, - remaining())); - } - } - return index; - } - - private Node evaluateSubscriptedIndex() - { - if (nextCharacterIs(Parser.SUBSCRIPT_DIGITS_ARRAY)) - { - if (!nextCharacterIs(Parser.SUBSCRIPT_DIGITS_ARRAY)) - { - return new LiteralConstant(this, - String.valueOf(previousCharacter)); - } - else - { - throw new ExpressionCompilerException(String.format("TODO: handle subscripted index starting with" - + " lastCharacter=%c this could be either a numeric literal constant or a " - + "alphanumeric variable reference")); - } - } - else - { - return null; - } - } - - /** - * Calls this{@link #evaluateOptionalIndependentVariableSpecification()} befor - * calling this{@link #determine()} and assigning the result to - * this{@link #rootNode} - * - * @return this - * @throws ExpressionCompilerException - */ - public Expression parse() - { - assert position == -1 : "parse must only be called before anything else has been parsed but position=" - + position; - evaluateOptionalIndependentVariableSpecification(); - nextCharacter(); - rootNode = determine(); - assert rootNode != null : "evaluateRootNode: determine() returned null, expression='" + expression + "'"; - rootNode.isResult = true; - return this; - } - - public Node exponentiate() throws ExpressionCompilerException - { - return exponentiate(evaluate()); - } - - /** - * TODO: this could probably be handled in - * this{@link #resolvePostfixOperators(Node)} - * - * @param node - * @return - * @throws ExpressionCompilerException - */ - private Node exponentiate(Node node) throws ExpressionCompilerException - { - if (nextCharacterIs('^')) - { - boolean parenthetical = false; - if (nextCharacterIs('(')) - { - parenthetical = true; - } - node = new Exponentiation<>(this, - node, - parenthetical ? determine() : evaluate()); - if (parenthetical) - { - if (!nextCharacterIs(')')) - { - throw new ExpressionCompilerException(String.format("parseExponent expected closing parenthesis at: position=%d, ch='%c'\n", - position, - character == -1 ? '?' : character)); - } - } - - return node; - } - else - { - return parseSuperscripts(node); - } - } - - /** - * @return the result of passing this{@link #exponentiate()} to - * this{@link #multiplyAndDivide(Node)} - */ - public Node exponentiateMultiplyAndDivide() - { - Node node = exponentiate(); - return multiplyAndDivide(node); - } - - /** - * Generate the implementation of the function after this{@link #parse()} has - * been invoked - * - * @return - * @throws ExpressionCompilerException - */ - public Expression compile() throws ExpressionCompilerException - { - - ClassVisitor classVisitor = constructClassVisitor(); - - try - { - generateFunctionInterface(this, className, classVisitor); - - generateEvaluationMethod(classVisitor); - - declareFields(classVisitor); - - generateDefaultConstructor(classVisitor); - - if (needsInitializer()) - { - generateInitializationMethod(classVisitor); - } - - if (recursive) - { - generateCopyConstructor(classVisitor); - } - - if (needsCloseMethod()) - { - generateCloseMethod(classVisitor); - } - - } - finally - { - classVisitor.visitEnd(); - } - - instructions = ((ClassWriter) classVisitor).toByteArray(); - - if (saveClasses) - { - File file = new File(className + ".class"); - writeBytecodes(file); - } - - return this; - } - - public MethodVisitor generateCloseFieldCall(MethodVisitor methodVisitor, String name, Class type) - { - methodVisitor.visitFieldInsn(GETFIELD, className, name, type.descriptorString()); - methodVisitor.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(type), "close", "()V", false); - return methodVisitor; - } - - public ClassVisitor generateCloseMethod(ClassVisitor classVisitor) - { - MethodVisitor methodVisitor = classVisitor.visitMethod(Opcodes.ACC_PUBLIC, "close", "()V", null, null); - - methodVisitor.visitCode(); - - literalConstants.forEach(constant -> generateCloseFieldCall(loadThisOntoStack(methodVisitor), - constant.fieldName, - constant.type())); - - intermediateVariables.forEach(intermediateVariable -> generateCloseFieldCall(loadThisOntoStack(methodVisitor), - intermediateVariable.name, - intermediateVariable.type)); - if (recursive) - { - generateCloseFieldCall(loadThisOntoStack(methodVisitor), functionName, functionClass); - } - - methodVisitor.visitInsn(Opcodes.RETURN); - methodVisitor.visitMaxs(0, 0); - methodVisitor.visitEnd(); - - return classVisitor; - } - - private void generateCodeToSetIsInitializedToTrue(MethodVisitor methodVisitor) - { - methodVisitor.visitVarInsn(ALOAD, 0); - methodVisitor.visitInsn(Opcodes.ICONST_1); - methodVisitor.visitFieldInsn(PUTFIELD, className, IS_INITIALIZED, "Z"); - } - - private void generateCodeToThrowErrorIfAlreadyInitialized(MethodVisitor methodVisitor) - { - methodVisitor.visitVarInsn(ALOAD, 0); - methodVisitor.visitFieldInsn(GETFIELD, className, IS_INITIALIZED, "Z"); - Label alreadyInitializedLabel = new Label(); - methodVisitor.visitJumpInsn(Opcodes.IFEQ, alreadyInitializedLabel); - - methodVisitor.visitTypeInsn(Opcodes.NEW, "java/lang/AssertionError"); - methodVisitor.visitInsn(Opcodes.DUP); - methodVisitor.visitLdcInsn("Already initialized"); - methodVisitor.visitMethodInsn(INVOKESPECIAL, - "java/lang/AssertionError", - "", - "(Ljava/lang/Object;)V", - false); - methodVisitor.visitInsn(Opcodes.ATHROW); - methodVisitor.visitLabel(alreadyInitializedLabel); - methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); - } - - private void generateConditionalInitializater(MethodVisitor methodVisitor) - { - methodVisitor.visitVarInsn(ALOAD, 0); - methodVisitor.visitFieldInsn(GETFIELD, className, IS_INITIALIZED, "Z"); - Label alreadyInitialized = new Label(); - methodVisitor.visitJumpInsn(Opcodes.IFNE, alreadyInitialized); - - methodVisitor.visitVarInsn(ALOAD, 0); - methodVisitor.visitMethodInsn(INVOKEVIRTUAL, className, nameOfInitializerFunction, "()V", false); - - methodVisitor.visitLabel(alreadyInitialized); - methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); - } - - public MethodVisitor generateContextInitializationCode(MethodVisitor methodVisitor) - { - generateCodeToThrowErrorIfAlreadyInitialized(methodVisitor); - - addChecksForNullVariableReferences(methodVisitor, false, false); - - if (needsInitializer()) - { - referencedFunctions.values().forEach(mapping -> generateContextInitializer(methodVisitor, mapping)); - - generateCodeToSetIsInitializedToTrue(methodVisitor); - } - - return methodVisitor; - } - - public MethodVisitor generateContextInitializer(MethodVisitor mv, FunctionMapping nestedFunction) - { - - if (nestedFunction.func != null) - { - var nestedFunctionsVariables = context.variableEntryStream() - .map(entry -> new OrderedPair>(entry.getKey(), - entry.getValue() - .getClass())) - .collect(toList()); - - initializeNestedFunctionVariableReferences(loadThisOntoStack(mv), - className, - Type.getInternalName(nestedFunction.type()), - nestedFunction.name, - nestedFunctionsVariables); - - } - else - { - assert nestedFunction.name.equals(functionName) : "nestedFunction.func should not be null if its" - + " not the recursive function referring to itself"; - - } - - return mv; - } - - public ClassVisitor generateCopyConstructor(ClassVisitor classVisitor) - { - MethodVisitor methodVisitor = classVisitor.visitMethod(ACC_PUBLIC, - "", - "(L" + className + ";)V", - null, - null); - methodVisitor.visitCode(); - - generateInvocationOfDefaultNoArgConstructor(methodVisitor, false); - - addChecksForNullVariableReferences(methodVisitor, false, true); - - for (Variable variable : referencedVariables.values()) - { - String variableName = variable.reference.name; - loadThisOntoStack(methodVisitor); - methodVisitor.visitVarInsn(ALOAD, 1); - loadFieldOntoStack(methodVisitor, variableName, variable.type().descriptorString()); - methodVisitor.visitFieldInsn(PUTFIELD, className, variableName, variable.type().descriptorString()); - } - - methodVisitor.visitInsn(RETURN); - methodVisitor.visitMaxs(0, 0); - methodVisitor.visitEnd(); - return classVisitor; - } - - public ClassVisitor generateDefaultConstructor(ClassVisitor classVisitor) - { - MethodVisitor mv = classVisitor.visitMethod(ACC_PUBLIC, "", "()V", null, null); - mv.visitCode(); - - generateInvocationOfDefaultNoArgConstructor(mv, true); - - referencedFunctions.values().stream().filter(func -> func.func != null).forEach(mapping -> - { - String fieldType = Type.getInternalName(mapping.type()); - mv.visitVarInsn(Opcodes.ALOAD, 0); - mv.visitTypeInsn(Opcodes.NEW, fieldType); - mv.visitInsn(Opcodes.DUP); - mv.visitMethodInsn(Opcodes.INVOKESPECIAL, fieldType, "", "()V", false); - mv.visitFieldInsn(Opcodes.PUTFIELD, className, mapping.name, "L" + fieldType + ";"); - }); - - generateLiteralConstantInitializers(mv); - - generateIntermediateVariableInitializers(mv); - - mv.visitInsn(RETURN); - mv.visitMaxs(0, 0); - mv.visitEnd(); - return classVisitor; - } - - public ClassVisitor generateEvaluationMethod(ClassVisitor classVisitor) throws ExpressionCompilerException - { - if (rootNode == null) - { - parse(); - } - - Label startLabel = new Label(); - Label endLabel = new Label(); - - MethodVisitor methodVisitor = classVisitor.visitMethod(Opcodes.ACC_PUBLIC, - "evaluate", - evaluationMethodDescriptor, - evaluateMethodSignature, - null); - - methodVisitor.visitCode(); - methodVisitor.visitLabel(startLabel); - - if (position < expression.length()) - { - throw new ExpressionCompilerException(String.format("unexpected '%c' character at position=%s in expression '%s' of length %d\n", - character, - position, - expression, - expression.length())); - } - - if (needsInitializer()) - { - generateConditionalInitializater(methodVisitor); - } - - if (checkForNullsBeforeEvaluating) - { - addChecksForNullVariableReferences(methodVisitor, false, false); - } - - rootNode.generate(classVisitor, methodVisitor, rangeType); - - methodVisitor.visitInsn(Opcodes.ARETURN); - - methodVisitor.visitLabel(endLabel); - - declareLocalVariables(methodVisitor, startLabel, endLabel); - - methodVisitor.visitMaxs(0, 0); - - methodVisitor.visitEnd(); - - return classVisitor; - } - - public ClassVisitor generateInitializationMethod(ClassVisitor classVisitor) - { - MethodVisitor methodVisitor = classVisitor.visitMethod(Opcodes.ACC_PUBLIC, - nameOfInitializerFunction, - "()V", - null, - null); - try - { - methodVisitor.visitCode(); - - generateContextInitializationCode(methodVisitor); - - methodVisitor.visitInsn(Opcodes.RETURN); - methodVisitor.visitMaxs(0, 0); - } - finally - { - methodVisitor.visitEnd(); - } - - return classVisitor; - } - - public MethodVisitor generateIntermediateVariableInitializers(MethodVisitor methodVisitor) - { - for (var intermediateVariable : intermediateVariables) - { - intermediateVariable.generateInitializer(methodVisitor); - } - return methodVisitor; - } - - public void generateInvocationOfDefaultNoArgConstructor(MethodVisitor methodVisitor, boolean object) - { - methodVisitor.visitVarInsn(ALOAD, 0); - methodVisitor.visitMethodInsn(INVOKESPECIAL, - object ? Type.getInternalName(Object.class) : className, - "", - "()V", - false); - } - - public MethodVisitor generateLiteralConstantInitializers(MethodVisitor methodVisitor) - { - for (var literal : literalConstants) - { - literal.generateLiteralConstantInitializerWithString(methodVisitor); - } - return methodVisitor; - } - - public String getFunctionClassTypeSignature() - { - - String classSignature; - SignatureWriter sw = new SignatureWriter(); - - sw.visitSuperclass().visitClassType(Type.getInternalName(Object.class)); - sw.visitEnd(); - - sw.visitInterface(); - sw.visitClassType(Type.getInternalName(Function.class)); - sw.visitTypeArgument('=').visitClassType(Type.getInternalName(domainType)); - sw.visitEnd(); - sw.visitTypeArgument('=').visitClassType(Type.getInternalName(rangeType)); - sw.visitEnd(); - sw.visitEnd(); - - classSignature = sw.toString(); - return classSignature; - } - - public String getNextConstantFieldName() - { - return "c" + constantCount++; - } - - public String getNextIntermediatevariableFieldName(Class type) - { - String prefix = getVariablePrefix(type); - AtomicInteger counter = intermediateVariableCounters.get(prefix); - if (counter == null) - { - intermediateVariableCounters.put(prefix, counter = new AtomicInteger(1)); - } - return prefix + counter.getAndIncrement(); - } - - public boolean hasPolynomialRange() - { - return rangeType.equals(RealPolynomial.class) || rangeType.equals(ComplexPolynomial.class); - } - - public void initializeNestedFunctionVariableReferences(MethodVisitor mv, - String classType, - String fieldType, - String functionFieldName, - List>> variables) - { - String typeDesc = "L" + fieldType + ";"; - - for (OrderedPair> variable : variables) - { - String variableFieldName = variable.getKey(); - String variableFieldType = variable.getValue().descriptorString(); - mv.visitVarInsn(Opcodes.ALOAD, 0); - mv.visitFieldInsn(Opcodes.GETFIELD, classType, functionFieldName, typeDesc); - mv.visitVarInsn(Opcodes.ALOAD, 0); - mv.visitFieldInsn(Opcodes.GETFIELD, classType, variableFieldName, variableFieldType); - mv.visitFieldInsn(Opcodes.PUTFIELD, fieldType, variableFieldName, variableFieldType); - } - - } - - public void injectVariableReferences(F f) throws NoSuchFieldException, IllegalAccessException - { - if (context != null) - { - context.variables.map.entrySet().forEach(entry -> - { - try - { - String variableName = entry.getKey(); - R value = variables.get(variableName); - setFieldValue(f, variableName, value, false); - } - catch (Exception e) - { - throw new RuntimeException(e.getMessage(), - e); - } - }); - } - } - - public F instantiate() - { - try - { - F f; - - f = instance = (compiledClass != null ? compiledClass : load()).getDeclaredConstructor().newInstance(); - - injectVariableReferences(f); - } - catch (Exception e) - { - wrapOrThrow(e); - } - - return instance; - } - - public MethodVisitor loadFieldOntoStack(MethodVisitor methodVisitor, String fieldName, String fieldDescriptor) - { - methodVisitor.visitFieldInsn(GETFIELD, className, fieldName, fieldDescriptor); - return methodVisitor; - } - - public MethodVisitor loadIndexField(MethodVisitor methodVisitor, String indexFieldName) - { - methodVisitor.visitFieldInsn(GETFIELD, className, indexFieldName, Integer.class.descriptorString()); - return methodVisitor; - } - - public Node multiplyAndDivide(Node node) - { - while (true) - { - if (nextCharacterIs('*', '×', 'ₓ')) - { - node = new Multiplication<>(this, - node, - exponentiate()); - - } - else if (nextCharacterIs('/', '÷')) - { - node = new Division<>(this, - node, - exponentiate()); - } - else - { - return node; - } - } - } - - public boolean needsCloseMethod() - { - return !literalConstants.isEmpty() | !intermediateVariables.isEmpty(); - } - - private boolean needsInitializer() - { - String onlyReferencedFunctionName = null; - - if (referencedFunctions.size() == 1) - { - onlyReferencedFunctionName = referencedFunctions.entrySet().iterator().next().getKey(); - } - - return !referencedFunctions.isEmpty() - && (functionName != null && !functionName.equals(onlyReferencedFunctionName)); - } - - public String newIntermediateVariable(Class type) - { - assert type != Void.class : "dont generate a variable for the Void type"; - String intermediateVarName = getNextIntermediatevariableFieldName(type); - intermediateVariables.add(new IntermediateVariable<>(this, - intermediateVarName, - type)); - - return intermediateVarName; - } - - private Variable newVariable(VariableReference reference) - { - var contextVar = context == null ? null : context.variables.get(reference.name); - reference.type = (context == null || contextVar == null) ? domainType : contextVar.getClass(); - Variable variable = new Variable(this, - reference); - return variable; - } - - public char nextCharacter() - { - return character = (++position < expression.length()) ? expression.charAt(position) : Character.MIN_VALUE; - } - - public boolean nextCharacterIs(char... expectedCharacters) - { - skipSpaces(); - for (char expectedCharacter : expectedCharacters) - { - if (character == expectedCharacter) - { - previousCharacter = character; - nextCharacter(); - return true; - } - } - - return false; - } - - private String parseName(int startPos) - { - boolean entirelySubscripted = true; - boolean isLatinOrGreek; - while ((isLatinOrGreek = isLatinOrGreek(character, true)) - || (entirelySubscripted && !isLatinOrGreek && Parser.isAlphaNumericSubscript(character))) - { - nextCharacter(); - if (isLatinOrGreek) - { - entirelySubscripted = false; - } - } - String substring = expression.substring(startPos, position); - String trimmedSubstring = substring.trim(); - String identifier = Utensils.subscriptToRegular(trimmedSubstring); - return identifier; - } - - public Node parseSuperscript(Node node, char superscript, String digit) - { - if (nextCharacterIs(superscript)) - { - node = new Exponentiation<>(this, - node, - new LiteralConstant<>(this, - digit)); - } - return node; - } - - public Node parseSuperscripts(Node node) - { - node = parseSuperscript(node, '⁰', "0"); - node = parseSuperscript(node, '¹', "1"); - node = parseSuperscript(node, '²', "2"); - node = parseSuperscript(node, '³', "3"); - node = parseSuperscript(node, '⁴', "4"); - node = parseSuperscript(node, '⁵', "5"); - node = parseSuperscript(node, '⁶', "6"); - node = parseSuperscript(node, '⁷', "7"); - node = parseSuperscript(node, '⁸', "8"); - node = parseSuperscript(node, '⁹', "9"); - return node; - } - - public boolean prevCharacterWas(char... expectedCharacters) - { - for (char expectedCharacter : expectedCharacters) - { - if (expectedCharacter == previousCharacter) - { - return true; - } - } - - return false; - } - - public String remaining() - { - return expression.substring(position, expression.length()); - } - - public String reserveIntermediateVariable(MethodVisitor methodVisitor, Class type) - { - String intermediateVariableName = newIntermediateVariable(type); - loadFieldOntoStack(loadThisOntoStack(methodVisitor), intermediateVariableName, type.descriptorString()); - return intermediateVariableName; - } - - private Node resolveFactorial(Node node) - { - if (nextCharacterIs('!')) - { - return new Factorial(this, - node); - } - return node; - } - - private Node resolveFunction(int startPos, VariableReference reference) - { - if ("when".equals(reference.name)) - { - return new When<>(this); - } - else - { - Node arg = determine(); - if (nextCharacterIs(')')) - { - return new FunctionCall<>(this, - reference.name, - arg); - } - else - { - throw new RuntimeException(String.format("expected closing parenthesis at: startPos=%s, position=%s," - + " identifier='%s', expression=%s\n", startPos, position, reference, expression)); - } - } - } - - public Node resolveFunctionOrVariableReference(int startPos) throws ExpressionCompilerException - { - VariableReference reference = evaluateName(startPos); - - boolean isFunction = nextCharacterIs('('); - - if (isFunction) - { - return resolveFunction(startPos, reference); - } - else if (LiteralConstant.constantSymbols.contains(reference.name)) - { - return new LiteralConstant<>(this, - reference.name); - } - else - { - Variable variable = newVariable(reference); - - return variable; - } - } - - private Node resolvePostfixOperators(Node node) - { - node = resolveRisingFactorial(node); - node = resolveFactorial(node); - return node; - } - - private Node resolveRisingFactorial(Node node) - { - if (nextCharacterIs('₍')) - { - Node power = determine(); - if (nextCharacterIs('₎')) - { - node = new RisingFactorial(this, - node, - power); - } - else - { - throw new ExpressionCompilerException(String.format("Expected ₎ not found at position %d in %s instead got %c with remaining %s\n", - position, - expression, - character, - remaining())); - } - } - - return node; - } - - public void setFieldValue(F f, String variableName, Object value, boolean overwrite) - { - java.lang.reflect.Field field; - try - { - field = compiledClass.getField(variableName); - field.set(f, value); - } - catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) - { - wrapOrThrow(e); - } - } - - public static void wrapOrThrow(Throwable e) - { - if (e instanceof RuntimeException) - { - throw (RuntimeException) e; - } - else - { - throw new RuntimeException(e); - } - } - - public MethodVisitor setResult(MethodVisitor methodVisitor, Class inputType) - { - checkClassCast(loadResultParameter(methodVisitor), rangeType).visitInsn(Opcodes.SWAP); - return invokeSetMethod(methodVisitor, inputType, rangeType); - } - - void skipSpaces() - { - while (character == ' ') - { - nextCharacter(); - } - } - - @Override - public String toString() - { - return String.format("Expression[expression=%s, className=%s, functionName=%s, recursive=%s, className=%s, functionClass=%s]", - expression, - className, - functionName, - recursive, - className, - functionClass); - } - - @Override - public String typeset() - { - return rootNode == null ? null : rootNode.typeset(); - } - - public Expression writeBytecodes(File file) - { - try - { - Files.write(Paths.get(file.toURI()), instructions); - } - catch (IOException e) - { - throw new RuntimeException(e.getMessage(), - e); - } - return this; - } - -} \ No newline at end of file diff --git a/src/main/java/arb/expressions/RealExpression.java b/src/main/java/arb/expressions/RealExpression.java deleted file mode 100644 index 4a592cf95..000000000 --- a/src/main/java/arb/expressions/RealExpression.java +++ /dev/null @@ -1,50 +0,0 @@ -package arb.expressions; - -import arb.Real; -import arb.documentation.BusinessSourceLicenseVersionOnePointOne; -import arb.documentation.TheArb4jLibrary; -import arb.functions.real.RealFunction; - -/** - * @see BusinessSourceLicenseVersionOnePointOne © terms of the - * {@link TheArb4jLibrary} - */ -public class RealExpression extends - Expression -{ - - public RealExpression(String className, - Class domainClass, - Class coDomainClass, - Class functionClass, - String expression, - Context context, - String functionName, - Expression parentExpression) - { - super(className, - domainClass, - coDomainClass, - functionClass, - expression, - context, - functionName, - parentExpression); - } - - public RealExpression(String className, - Class domainClass, - Class coDomainClass, - Class functionClass, - String expressionString, - Context context) - { - super(className, - domainClass, - coDomainClass, - functionClass, - expressionString, - context); - } - -} diff --git a/src/main/java/arb/expressions/nodes/Node.java b/src/main/java/arb/expressions/nodes/Node.java index 0037eae77..e24411fcc 100644 --- a/src/main/java/arb/expressions/nodes/Node.java +++ b/src/main/java/arb/expressions/nodes/Node.java @@ -366,4 +366,9 @@ public Node sec() return apply("sec"); } + public boolean isIndependentOf(VariableNode variable) + { + return !dependsOn(variable); + } + } diff --git a/src/main/java/arb/expressions/nodes/binary/AscendingFactorializationNode.java b/src/main/java/arb/expressions/nodes/binary/AscendingFactorializationNode.java index 2a47618c0..993d4db0e 100644 --- a/src/main/java/arb/expressions/nodes/binary/AscendingFactorializationNode.java +++ b/src/main/java/arb/expressions/nodes/binary/AscendingFactorializationNode.java @@ -1,8 +1,8 @@ package arb.expressions.nodes.binary; import arb.Field; -import arb.Real; import arb.Fraction; +import arb.Real; import arb.documentation.BusinessSourceLicenseVersionOnePointOne; import arb.documentation.TheArb4jLibrary; import arb.expressions.Expression; @@ -102,8 +102,30 @@ public Node integrate(VariableNode variable) @Override public Node differentiate(VariableNode variable) { - assert false : "TODO: differentiate " + this + " with respect to " + variable; - return null; + // Case 1: Diff(pochhammer(f(x),y),x) + if (right.isIndependentOf(variable)) + { + // diff(f(x),x)*pochhammer(f(x),y)*(Psi(y+f(x))-Psi(f(x))) + var dfx = left.differentiate(variable); + var psiSum = right.add(left).digamma(); + var psiLeft = left.digamma(); + var psiDiff = psiSum.sub(psiLeft); + return dfx.mul(this).mul(psiDiff); + } + // Case 2: Diff(pochhammer(x,f(y)),y) + else if (left.isIndependentOf(variable)) + { + // diff(f(y),y)*pochhammer(x,f(y))*Psi(f(y)+x) + var dfy = right.differentiate(variable); + var psiTerm = right.add(left).digamma(); + return dfy.mul(this).mul(psiTerm); + } + // Case 3: Both terms depend on the variable + else + { + throw new UnsupportedOperationException("TODO: implement Differentiation of Pochhammer symbol with both terms dependent on the variable is not implemented: " + + this); + } } @Override