diff --git a/Treetop.tmbundle/Support/nibs/SyntaxTreeViewer.nib/designable.nib b/Treetop.tmbundle/Support/nibs/SyntaxTreeViewer.nib/designable.nib new file mode 100644 index 0000000..caf031e --- /dev/null +++ b/Treetop.tmbundle/Support/nibs/SyntaxTreeViewer.nib/designable.nib @@ -0,0 +1,1524 @@ + + + + 1050 + 9E17 + 629 + 949.33 + 352.00 + + YES + + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + YES + + NSObject + + + FirstResponder + + + NSApplication + + + + YES + input + syntax_tree + controller + selected_tab + + YES + + + + + YES + class_and_modules + offset + text_value + methods + + + getIndexes + + YES + + YES + YES + YES + elements + + + 15 + 2 + {{83, 222}, {1112, 670}} + 603979776 + Window + NSWindow + + + + 256 + + YES + + + 18 + + YES + + + 256 + + YES + + + 289 + {{1001, 9}, {96, 32}} + + + YES + + 67239424 + 134217728 + Run + + LucidaGrande + 1.300000e+01 + 1044 + + + -2038284033 + 268435585 + + DQ + 200 + 25 + + + + + 256 + + YES + + + 2304 + + YES + + + 2322 + + YES + + YES + Apple HTML pasteboard type + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + Apple URL pasteboard type + CorePasteboardFlavorType 0x6D6F6F76 + CorePasteboardFlavorType 0x75726C20 + NSColor pasteboard type + NSFilenamesPboardType + NSStringPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT RTFD pasteboard type + NeXT Rich Text Format v1.0 pasteboard type + NeXT TIFF v4.0 pasteboard type + NeXT font pasteboard type + NeXT ruler pasteboard type + WebURLsWithTitlesPboardType + + + {1097, 36} + + + + + + + Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum Et harumd und lookum like Greek to me, dereud facilis est er expedit distinct. Nam liber te conscient to factor tum poen legum odioque civiuda + + + YES + + YES + + YES + NSFont + NSParagraphStyle + + + YES + + + 1.000000e+01 + 2843 + + + 3 + + YES + + 0.000000e+00 + + + 5.600000e+01 + + + 1.120000e+02 + + + 1.680000e+02 + + + 2.240000e+02 + + + 2.800000e+02 + + + 3.360000e+02 + + + 3.920000e+02 + + + 4.480000e+02 + + + 5.040000e+02 + + + 5.600000e+02 + + + 6.160000e+02 + + + 6.720000e+02 + + + 7.280000e+02 + + + 7.840000e+02 + + + 8.400000e+02 + + + 8.960000e+02 + + + 9.520000e+02 + + + 1.008000e+03 + + + 1.064000e+03 + + + 1.120000e+03 + + + 1.176000e+03 + + + 1.232000e+03 + + + 1.288000e+03 + + + 1.344000e+03 + + + 1.400000e+03 + + + 1.456000e+03 + + + 1.512000e+03 + + + 1.568000e+03 + + + 1.624000e+03 + + + 1.680000e+03 + + + 1.736000e+03 + + + + + + + YES + + YES + + + + + YES + + LucidaGrande-Bold + 1.000000e+01 + 16 + + + 3 + + YES + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GQAEAQgADAEiAAcBhAQAA + + + + + YES + + + 6 + + + + 1.097000e+03 + 1 + + + 12035 + + 3 + MQA + + + 3 + MAA + + + YES + + YES + NSBackgroundColor + NSColor + + + YES + + 6 + System + selectedTextBackgroundColor + + 3 + MC42NjY2NjY2OQA + + + + 6 + + selectedTextColor + + + + + + + YES + + YES + + NSUnderline + + + YES + + 1 + MCAwIDEAA + + + + + + + 6 + {1104, 1e+07} + {223, 29} + + + + {{1, 1}, {1097, 566}} + + + + + + {4, -5} + 1 + + 4 + + + + 256 + {{1098, 1}, {15, 566}} + + + + _doScroller: + 8.839779e-01 + + + + 256 + {{-100, -100}, {87, 18}} + + + 1 + + + 1.000000e+00 + 9.456522e-01 + + + {{-3, 57}, {1114, 568}} + + + 18 + + + + + + {{10, 33}, {1108, 628}} + + + + + {{-8, -10}, {1128, 674}} + + + + YES + + 1 + + + 256 + + YES + + + 274 + + YES + + + 2304 + + YES + + + 256 + {1097, 595} + + YES + + + 256 + {1097, 17} + + + + + + 256 + {{1098, 0}, {16, 17}} + + + + YES + + 2.470000e+02 + 1.600000e+01 + 1.000000e+03 + + 75628032 + 0 + Class + Modules + + + 1.100000e+01 + 3100 + + + 3 + MC4zMzMzMzI5OQA + + + 6 + + headerTextColor + + + + + 337772096 + 2048 + Text Cell + + + + 6 + + controlBackgroundColor + + + + 6 + + controlTextColor + + + + 2 + YES + + + + 4.900000e+01 + 4.000000e+01 + 1.000000e+03 + + 75628032 + 0 + Offset + + + + + + 337772096 + 2048 + + + + + + + 2 + YES + + + + 4.510000e+02 + 1.000000e+01 + 3.402823e+38 + + 75628032 + 0 + Text + + + 6 + + headerColor + + + + + + 337772096 + 2048 + + + + + + + 3 + YES + + + + 3.380000e+02 + 1.000000e+01 + 3.402823e+38 + + 75628032 + 0 + Methods + + + + + + 337772096 + 2048 + + + + + + + 3 + YES + + + + 3.000000e+00 + 2.000000e+00 + + + 6 + + gridColor + + 3 + MC41AA + + + 1.700000e+01 + -759136256 + 1 + 15 + 0 + YES + YES + + + {{1, 17}, {1097, 595}} + + + + 4 + + + + 256 + {{1098, 17}, {15, 595}} + + + + 9.983193e-01 + + + + 256 + {{1, 612}, {1097, 15}} + + 1 + + + 9.990892e-01 + + + + 2304 + + YES + + + {{1, 0}, {1097, 17}} + + + + 4 + + + + {{-3, -3}, {1114, 628}} + + 50 + + + + + + QSAAAEEgAABBmAAAQZgAAA + + + {{10, 33}, {1108, 628}} + + Syntax Tree + + 6 + + controlColor + + + + + + 2 + + Input + + + + + + + 0 + YES + YES + + + {1112, 670} + + + + {{0, 0}, {1680, 1028}} + + + + + YES + + + contentObject: parameters + + + + + + + contentObject + parameters + 2 + + + 5 + + + + contentObject: selection.syntax_tree + + + + + + + + selection.syntax_tree + 2 + + + 74 + + + + value: arrangedObjects.class_and_modules + + + + + + + value + arrangedObjects.class_and_modules + 2 + + + 240 + + + + value: arrangedObjects.offset + + + + + + + + arrangedObjects.offset + 2 + + + 242 + + + + value: arrangedObjects.text_value + + + + + + + + arrangedObjects.text_value + 2 + + + 244 + + + + value: arrangedObjects.methods + + + + + + + + arrangedObjects.methods + 2 + + + 245 + + + + value: selection.input + + + + + + + value + selection.input + + NSAlwaysPresentsApplicationModalAlerts + + + 2 + + + 266 + + + + argument: selection.input + + + + + + + argument + selection.input + + NSSelectorName + returnArgument: + + 2 + + + 271 + + + + target: selection.controller + + + + + + + target + selection.controller + + + returnArgument: + + + 2 + + + 272 + + + + selectedLabel: selection.selected_tab + + + + + + + selectedLabel + selection.selected_tab + 2 + + + 274 + + + + + YES + + 0 + + YES + + + + + + -2 + + + RmlsZSdzIE93bmVyA + + + -1 + + + First Responder + + + -3 + + + Application + + + 3 + + + + + 72 + + + + + 210 + + + YES + + + + + + 211 + + + YES + + + + + + 212 + + + YES + + + + + + + 214 + + + YES + + + + + + 215 + + + YES + + + + + + + 221 + + + YES + + + + + + 222 + + + + + 213 + + + YES + + + + + + 216 + + + YES + + + + + + 223 + + + YES + + + + + + + + + 236 + + + + + 226 + + + YES + + + + + + + + + 234 + + + YES + + + + + + 235 + + + + + 232 + + + YES + + + + + + 233 + + + + + 229 + + + YES + + + + + + 230 + + + + + 228 + + + YES + + + + + + 231 + + + + + 225 + + + + + 224 + + + + + 257 + + + YES + + + + + + + + 258 + + + + + 259 + + + + + 260 + + + + + + + YES + + YES + -1.IBPluginDependency + -2.IBPluginDependency + -3.IBPluginDependency + 210.IBPluginDependency + 210.IBWindowTemplateEditedContentRect + 210.NSWindowTemplate.visibleAtLaunch + 210.editorWindowContentRectSynchronizationRect + 211.IBPluginDependency + 212.IBPluginDependency + 213.IBPluginDependency + 214.IBPluginDependency + 215.IBPluginDependency + 216.IBPluginDependency + 221.IBPluginDependency + 222.IBPluginDependency + 223.IBPluginDependency + 224.IBPluginDependency + 225.IBPluginDependency + 226.IBPluginDependency + 228.IBPluginDependency + 229.IBPluginDependency + 230.IBPluginDependency + 231.IBPluginDependency + 257.IBPluginDependency + 258.IBPluginDependency + 259.IBPluginDependency + 260.IBPluginDependency + 3.IBPluginDependency + 72.IBPluginDependency + + + YES + + + + + {{82, 256}, {1112, 670}} + + {{82, 256}, {1112, 670}} + + + + + + + + + + + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + + + + YES + + YES + + + YES + + + + + YES + + YES + + + YES + + + + 274 + + + + YES + + + 0 + + 3 + + YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA +AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxEBdgALAAwAMQA1ADYAOwA8 +AEEAVQBWAFcAWAALAGUAaQB+AIIAiQCOAJkAmgCyALMAuwC8AL4AvwDAAMQAygDYAN4A7gDyAQcBGwEc +AR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBMAExATsBQwFMAVABUwFYAWEAbQFiAWgBiwGP +AZIBlQGYAZsBngGhAaQBpwGqAa0BsAGzAbYBuQG8Ab8BwgHFAcgBywHOAdEB1AHXAdoB3QHgAeMB5gHp +AewB7wHyAfQB+QH8AgQCBwIqAi4CLwIyAjYCOgI+AkICRAJGAlYCWwJeAmECSgJdAmkCcAJxAnICdQJ6 +AnsCgwE2AoQCiAKLAowCjQKQApEClgKXApkCnAKoAqkCqgKtArgCuQK6Ar0CvgLAAsECxgLQAtEC1gLa +AusC8wL7Av8DGwMcAyMDKwMsAy8DNAM1AzgDPwNOA1YDVwNcA18DZANlA2kDcgNzA3gDeQN+A38DgQOE +A4wDkgOTA5oDogOoA6kDrgOvA7YDvQPDA8QDywPQA9ED1APXA9gD4APhA+kD6gPuA+8CvQPwA/ED9gP3 +A/oEAQQCBAMEBQALBAYEBwQKBBcEIwQzBD0EPgQ/BEAEQQRCBEMERQRHBEgETQROBE8EUARUBFsEYARn +BGgEaQRqBGwEbgRvBHAEcQR4BHkEegSBBIIEgwSKBIsEjASTBJQElQSeBJ8EoAShBKcEqASpBLMEtAS1 +BLYEqAS8BMQETgSgBMUEywB6BM0E1ATVBNYE1wT3BPoE+wUbBTwFXQVeBV8FYAVhBWIFYwVkBWUFZgVn +BWgFaQVqBWsFbAVtBW4FbwVwBXEFcgVzBXQFdQV2BXcFeAV5BXoFewV+BYEFrAXXBdgF2QXaBdsF3AXd +Bd4F3wXgBeEF4gXjBeQF5QXmBecF6AXpBeoF6wXsBe0F7gXvBfAF8QXyBfMF9AX1AucF9gX3AWcF+AX5 +BfoF+wX8Bf0GAAYDBgZVJG51bGzfEBIADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4A +HwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADBWTlNSb290ViRjbGFzc11OU09iamVjdHNL +ZXlzXxAPTlNDbGFzc2VzVmFsdWVzXxAZTlNBY2Nlc3NpYmlsaXR5T2lkc1ZhbHVlc11OU0Nvbm5lY3Rp +b25zW05TTmFtZXNLZXlzW05TRnJhbWV3b3JrXU5TQ2xhc3Nlc0tleXNaTlNPaWRzS2V5c11OU05hbWVz +VmFsdWVzXxAZTlNBY2Nlc3NpYmlsaXR5Q29ubmVjdG9yc11OU0ZvbnRNYW5hZ2VyXxAQTlNWaXNpYmxl +V2luZG93c18QD05TT2JqZWN0c1ZhbHVlc18QF05TQWNjZXNzaWJpbGl0eU9pZHNLZXlzWU5TTmV4dE9p +ZFxOU09pZHNWYWx1ZXOAAoEBdYEBIoEBR4EBdIDhgQEmgAWBAUaBAUiBASeBAXKAAIAGgQElgQFzEQEU +gQFJ0gAOADIAMwA0W05TQ2xhc3NOYW1lgASAA1hOU09iamVjdNIANwA4ADkAOlgkY2xhc3Nlc1okY2xh +c3NuYW1logA6ADVeTlNDdXN0b21PYmplY3RfEBBJQkNvY29hRnJhbWV3b3Jr0gAOAD0APgA/Wk5TLm9i +amVjdHOANKEAQIAH2gBCAA4AQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTACtcTlNXaW5k +b3dWaWV3XE5TU2NyZWVuUmVjdF1OU1dpbmRvd1RpdGxlWU5TV1RGbGFnc11OU1dpbmRvd0NsYXNzXE5T +V2luZG93UmVjdF8QD05TV2luZG93QmFja2luZ18QEU5TV2luZG93U3R5bGVNYXNrW05TVmlld0NsYXNz +gAuA4IDfgAkSJAAAAIAKgAgQAhAPgABfEBh7ezgzLCAyMjJ9LCB7MTExMiwgNjcwfX1WV2luZG93WE5T +V2luZG931wBZAA4AWgBbAFwAVwBdAF4AXwBgAGEAYgBeAGRfEA9OU05leHRSZXNwb25kZXJaTlNTdWJ2 +aWV3c1hOU3ZGbGFnc1tOU0ZyYW1lU2l6ZVtOU1N1cGVydmlld4AMgJWADREBAIDdgAyA3tIADgA9AGYA +Z4BroQBogA7dAFkADgBqAGsAbABtAFoAWwBXAG4AXQBvAHAASwByAHMAdAB1AHYAdwB4AF4AegBLAHoA +fV5OU1RhYlZpZXdJdGVtc1lOU1R2RmxhZ3NXTlNGcmFtZVZOU0ZvbnRfEBFOU0RyYXdzQmFja2dyb3Vu +ZF8QFk5TQWxsb3dUcnVuY2F0ZWRMYWJlbHNfEBVOU1NlbGVjdGVkVGFiVmlld0l0ZW2AC4DcgJcQAICW +gBaADxASgAwJgAsJgNnSAA4APQBmAICAa6EAgYAQ1wBZAA4AbABaAFsAVwBdAGgAXwCFAIYAYQBeAGiA +DoCVgJSAEYAMgA7SAA4APQBmAIuAa6IAjACNgBKAHdgAWQAOAGwAjwBbAJAAVwBdAIEAkgCTAJQAlQB6 +AF4AgVZOU0NlbGxZTlNFbmFibGVkgBCAHIATgBQRASEJgAyAEF8QFXt7MTAwMSwgOX0sIHs5NiwgMzJ9 +fdwAmwAOAJwAnQCeAJ8AoAChAKIAowCkAKUApgCnAKgAqQCqAKsArAB2AIwArwCwALFbTlNDZWxsRmxh +Z3NfEBNOU0FsdGVybmF0ZUNvbnRlbnRzXxASTlNQZXJpb2RpY0ludGVydmFsXk5TQnV0dG9uRmxhZ3My +XxAPTlNLZXlFcXVpdmFsZW50Wk5TQ29udGVudHNZTlNTdXBwb3J0XU5TQ29udHJvbFZpZXdfEA9OU1Bl +cmlvZGljRGVsYXlcTlNDZWxsRmxhZ3MyXU5TQnV0dG9uRmxhZ3MSBAH+AIAbgBkQGRIQAACBgBqAFYAW +gBIQyBIIAAAAE/////+GgkD/U1J1btQADgC0ALUAtgC3ALgAuQC6Vk5TU2l6ZVZOU05hbWVYTlNmRmxh +Z3OAGCNAKgAAAAAAAIAXEQQUXEx1Y2lkYUdyYW5kZdIANwA4AL0AbaIAbQA1UFEN0gA3ADgAwQDCpADC +AMMAjwA1XE5TQnV0dG9uQ2VsbFxOU0FjdGlvbkNlbGzSADcAOADFAMalAMYAxwDIAMkANVhOU0J1dHRv +bllOU0NvbnRyb2xWTlNWaWV3W05TUmVzcG9uZGVy2wBZAMsADgBsAMwAWgBbAFcAXQDNAM4AgQDQANEA +0gB4ANMAYQBeAIEA1gDXW05TSFNjcm9sbGVyWE5Tc0ZsYWdzW05TVlNjcm9sbGVyXU5TQ29udGVudFZp +ZXeAEICQgJOAkoAegAyAEICMgB/SAA4APQBmANqAa6MA1wDWANCAH4CMgJDbAFkADgBsAN8A4ABaAFsA +4QBXAOIAXQCNAOQA5QDmAOcA6ADpAOoAXgDsAI1YTlNDdXJzb3JZTlNjdkZsYWdzWU5TRG9jVmlld1lO +U0JHQ29sb3KAHYCLgIeAiBAEgCARCQCAIYAMgHOAHdIADgA9AGYA8IBroQDqgCHdAFkADgDzAPQA9QD2 +AFsAXAD3AFcA+ABdAPkA1wD7APwA/QD+AP8BAAEBAQIAXgEEANcAK18QD05TVGV4dENvbnRhaW5lcllO +U1RWRmxhZ3NcTlNTaGFyZWREYXRhW05TRHJhZ1R5cGVzWU5TTWF4U2l6ZVhOU01pbml6ZVpOU0RlbGVn +YXRlgB+AhoA2EAaAcoAiEQkSgDWAhIAMgIWAH4AA0gAOAD0APgEJgDSvEBEBCgELAQwBDQEOAQ8BEAER +ARIBEwEUARUBFgEXARgBGQEagCOAJIAlgCaAJ4AogCmAKoArgCyALYAugC+AMIAxgDKAM18QGU5lWFQg +UlRGRCBwYXN0ZWJvYXJkIHR5cGVfEBJOU1N0cmluZ1Bib2FyZFR5cGVfEBpOZVhUIHJ1bGVyIHBhc3Rl +Ym9hcmQgdHlwZV8QHk5lWFQgVElGRiB2NC4wIHBhc3RlYm9hcmQgdHlwZV8QGUFwcGxlIFVSTCBwYXN0 +ZWJvYXJkIHR5cGVfECNDb3JlUGFzdGVib2FyZEZsYXZvclR5cGUgMHg2RDZGNkY3Nl8QG1dlYlVSTHNX +aXRoVGl0bGVzUGJvYXJkVHlwZV8QI0NvcmVQYXN0ZWJvYXJkRmxhdm9yVHlwZSAweDc1NzI2QzIwXxAZ +QXBwbGUgUERGIHBhc3RlYm9hcmQgdHlwZV8QGUFwcGxlIFBORyBwYXN0ZWJvYXJkIHR5cGVfEBpBcHBs +ZSBIVE1MIHBhc3RlYm9hcmQgdHlwZV8QFU5TRmlsZW5hbWVzUGJvYXJkVHlwZV8QMU5lWFQgRW5jYXBz +dWxhdGVkIFBvc3RTY3JpcHQgdjEuMiBwYXN0ZWJvYXJkIHR5cGVfEBdOU0NvbG9yIHBhc3RlYm9hcmQg +dHlwZV8QGkFwcGxlIFBJQ1QgcGFzdGVib2FyZCB0eXBlXxAZTmVYVCBmb250IHBhc3RlYm9hcmQgdHlw +ZV8QKk5lWFQgUmljaCBUZXh0IEZvcm1hdCB2MS4wIHBhc3RlYm9hcmQgdHlwZdIANwA4AS0BLqMBLgEv +ADVcTlNNdXRhYmxlU2V0VU5TU2V0WnsxMDk3LCAzNn3VATIADgEzATQBNQE2ATcA6gE5ATpZTlNUQ0Zs +YWdzWk5TVGV4dFZpZXdXTlNXaWR0aF8QD05TTGF5b3V0TWFuYWdlchABgHGAISNAkSQAAAAAAIA31QAO +ATwBPQE+APkBPwFAAUEA/QArXxAQTlNUZXh0Q29udGFpbmVyc11OU1RleHRTdG9yYWdlWU5TTE1GbGFn +c4BwgG+AOIAA1QAOAUQBRQFGAPkBRwFIAUkBSgArXE5TQXR0cmlidXRlc1hOU1N0cmluZ18QD05TQXR0 +cmlidXRlSW5mb4BugDuAOYBsgADSAA4BTQFOAU9ZTlMuc3RyaW5ngDpfEQJeTG9yZW0gaXBzdW0gZG9s +b3Igc2l0IGVyIGVsaXQgbGFtZXQsIGNvbnNlY3RldGF1ciBjaWxsaXVtIGFkaXBpc2ljaW5nIHBlY3Us +IHNlZCBkbyBlaXVzbW9kIHRlbXBvciBpbmNpZGlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEg +YWxpcXVhLiBVdCBlbmltIGFkIG1pbmltIHZlbmlhbSwgcXVpcyBub3N0cnVkIGV4ZXJjaXRhdGlvbiB1 +bGxhbWNvIGxhYm9yaXMgbmlzaSB1dCBhbGlxdWlwIGV4IGVhIGNvbW1vZG8gY29uc2VxdWF0LiBEdWlz +IGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJpdCBpbiB2b2x1cHRhdGUgdmVsaXQgZXNzZSBj +aWxsdW0gZG9sb3JlIGV1IGZ1Z2lhdCBudWxsYSBwYXJpYXR1ci4gRXhjZXB0ZXVyIHNpbnQgb2NjYWVj +YXQgY3VwaWRhdGF0IG5vbiBwcm9pZGVudCwgc3VudCBpbiBjdWxwYSBxdWkgb2ZmaWNpYSBkZXNlcnVu +dCBtb2xsaXQgYW5pbSBpZCBlc3QgbGFib3J1bSBFdCBoYXJ1bWQgdW5kIGxvb2t1bSBsaWtlIEdyZWVr +IHRvIG1lLCBkZXJldWQgZmFjaWxpcyBlc3QgZXIgZXhwZWRpdCBkaXN0aW5jdC4gTmFtIGxpYmVyIHRl +IGNvbnNjaWVudCB0byBmYWN0b3IgdHVtIHBvZW4gbGVndW0gb2Rpb3F1ZSBjaXZpdWRh0gA3ADgBUQFS +owFSAUUANV8QD05TTXV0YWJsZVN0cmluZ9IADgA9AGYBVYBrogFWAVeAPIBm0wAOAVkAPQFaAVsBXldO +Uy5rZXlzgGWiAVwBXYA9gD6iAV8BYIA/gGRfEBBOU1BhcmFncmFwaFN0eWxl0wFjAA4BZAFlAWYBZ1pO +U1RhYlN0b3BzW05TQWxpZ25tZW50gECAYxAD0gAOAD0BaQFqgGKvECABawFsAW0BbgFvAXABcQFyAXMB +dAF1AXYBdwF4AXkBegF7AXwBfQF+AX8BgAGBAYIBgwGEAYUBhgGHAYgBiQGKgEGAQ4BEgEWARoBHgEiA +SYBKgEuATIBNgE6AT4BQgFGAUoBTgFSAVYBWgFeAWIBZgFqAW4BcgF2AXoBfgGCAYdIADgGMAY0BjlpO +U0xvY2F0aW9ugEIjAAAAAAAAAADSADcAOAGQAZGiAZEANVlOU1RleHRUYWLSAA4BjAGNAZSAQiNATAAA +AAAAANIADgGMAY0Bl4BCI0BcAAAAAAAA0gAOAYwBjQGagEIjQGUAAAAAAADSAA4BjAGNAZ2AQiNAbAAA +AAAAANIADgGMAY0BoIBCI0BxgAAAAAAA0gAOAYwBjQGjgEIjQHUAAAAAAADSAA4BjAGNAaaAQiNAeIAA +AAAAANIADgGMAY0BqYBCI0B8AAAAAAAA0gAOAYwBjQGsgEIjQH+AAAAAAADSAA4BjAGNAa+AQiNAgYAA +AAAAANIADgGMAY0BsoBCI0CDQAAAAAAA0gAOAYwBjQG1gEIjQIUAAAAAAADSAA4BjAGNAbiAQiNAhsAA +AAAAANIADgGMAY0Bu4BCI0CIgAAAAAAA0gAOAYwBjQG+gEIjQIpAAAAAAADSAA4BjAGNAcGAQiNAjAAA +AAAAANIADgGMAY0BxIBCI0CNwAAAAAAA0gAOAYwBjQHHgEIjQI+AAAAAAADSAA4BjAGNAcqAQiNAkKAA +AAAAANIADgGMAY0BzYBCI0CRgAAAAAAA0gAOAYwBjQHQgEIjQJJgAAAAAADSAA4BjAGNAdOAQiNAk0AA +AAAAANIADgGMAY0B1oBCI0CUIAAAAAAA0gAOAYwBjQHZgEIjQJUAAAAAAADSAA4BjAGNAdyAQiNAleAA +AAAAANIADgGMAY0B34BCI0CWwAAAAAAA0gAOAYwBjQHigEIjQJegAAAAAADSAA4BjAGNAeWAQiNAmIAA +AAAAANIADgGMAY0B6IBCI0CZYAAAAAAA0gAOAYwBjQHrgEIjQJpAAAAAAADSAA4BjAGNAe6AQiNAmyAA +AAAAANIANwA4AfAB8aIB8QA1V05TQXJyYXnSADcAOAHzAWGiAWEANdQADgC0ALUAtgC3AfYAuQH4gBgj +QCQAAAAAAACAFxELG9IANwA4AfoB+6IB+wA1XE5TRGljdGlvbmFyedMADgFZAD0BWgH+AgGAZaIBXAFd +gD2APqICAgIDgGeAadMBYwAOAWQCBQFmAWeAaIBj0gAOAD0BaQIJgGKvECABawFsAW0BbgFvAXABcQFy +AXMBdAF1AXYBdwF4AXkBegF7AXwBfQF+AX8BgAGBAYIBgwGEAYUBhgGHAYgBiQGKgEGAQ4BEgEWARoBH +gEiASYBKgEuATIBNgE6AT4BQgFGAUoBTgFSAVYBWgFeAWIBZgFqAW4BcgF2AXoBfgGCAYdQADgC0ALUA +tgC3AfYCLAItgBiAahAQXxARTHVjaWRhR3JhbmRlLUJvbGTSADcAOAIwAjGjAjEB8QA1Xk5TTXV0YWJs +ZUFycmF50gAOAjMCNAI1V05TLmRhdGGAbU8QDxkABAEIAAwBIgAHAYQEANIANwA4AjcCOKMCOAI5ADVd +TlNNdXRhYmxlRGF0YVZOU0RhdGHSADcAOAI7AT2kAT0CPAI9ADVfEBlOU011dGFibGVBdHRyaWJ1dGVk +U3RyaW5nXxASTlNBdHRyaWJ1dGVkU3RyaW5n0gAOAD0AZgJAgGuhAPyANtIANwA4AkMBNaIBNQA10gA3 +ADgCRQDzogDzADXYAA4CRwJIAkkCSgJLAkwCTQJOAk8AKwJRAOwCUwArAlVXTlNGbGFnc18QF05TRGVm +YXVsdFBhcmFncmFwaFN0eWxlXxAQTlNJbnNlcnRpb25Db2xvcl8QEU5TQmFja2dyb3VuZENvbG9yXxAU +TlNTZWxlY3RlZEF0dHJpYnV0ZXNfEBJOU01hcmtlZEF0dHJpYnV0ZXNfEBBOU0xpbmtBdHRyaWJ1dGVz +gIMRLwOAAIB1gHOAdoAAgH/TAA4CVwJYAlkBZwJaXE5TQ29sb3JTcGFjZVdOU1doaXRlgHRCMQDSADcA +OAJcAl2iAl0ANVdOU0NvbG9y0wAOAlcCWAJZAWcCYIB0QjAA0wAOAVkAPQFaAmMCZoBlogJkAmWAd4B4 +ogJnAmiAeYB91QAOAl0CVwJqAmsCWQJtAP0CbgJvW05TQ29sb3JOYW1lXU5TQ2F0YWxvZ05hbWWAdIB8 +gHuAelZTeXN0ZW1fEBtzZWxlY3RlZFRleHRCYWNrZ3JvdW5kQ29sb3LTAA4CVwJYAlkBZwJ0gHRLMC42 +NjY2NjY2OQDVAA4CXQJXAmoCawJZAlEA/QJ4Am+AdIB1gH6Ael8QEXNlbGVjdGVkVGV4dENvbG9y0wAO +AVkAPQFaAn0CgIBlogJ+AmWAgIB4ogKBAoKAgYCCW05TVW5kZXJsaW5l0wAOAlcChQJZATYCh1VOU1JH +QoB0RjAgMCAxANIANwA4AokCiqICigA1XxAUTlNUZXh0Vmlld1NoYXJlZERhdGFdezExMDQsIDFlKzA3 +fVl7MjIzLCAyOX3SADcAOAKOATOlATMCjwDIAMkANVZOU1RleHRfEBV7ezEsIDF9LCB7MTA5NywgNTY2 +fX3TAA4CkgKTApQClQE2WU5TSG90U3BvdFxOU0N1cnNvclR5cGWAioCJV3s0LCAtNX3SADcAOAKYAN+i +AN8ANdIANwA4ApoCm6QCmwDIAMkANVpOU0NsaXBWaWV32QBZAp0ADgBsAFsAVwKeAF0CnwCNAI0CogKj +AGEAXgKlAI0Cp1hOU1RhcmdldFhOU0FjdGlvbllOU1BlcmNlbnSAHYAdgI+AjYAMgI6AHSM/7EmMAAAA +AF8QFnt7MTA5OCwgMX0sIHsxNSwgNTY2fX1cX2RvU2Nyb2xsZXI60gA3ADgCqwKspQKsAMcAyADJADVa +TlNTY3JvbGxlctsAWQKdAA4AbADMAFsAVwKeAF0CrgKfAI0AjQKiArIBNgBhAF4CpQCNArYCt1pOU0N1 +clZhbHVlgB2AHYCPgJGADICOgB0jP/AAAAAAAAAjP+5CyGAAAABfEBh7ey0xMDAsIC0xMDB9LCB7ODcs +IDE4fX1fEBd7ey0zLCA1N30sIHsxMTE0LCA1Njh9fdIANwA4ArsCvKQCvADIAMkANVxOU1Njcm9sbFZp +ZXdfEBd7ezEwLCAzM30sIHsxMTA4LCA2Mjh9fdIANwA4Ar8AyKMAyADJADVfEBh7ey04LCAtMTB9LCB7 +MTEyOCwgNjc0fX3SAA4APQBmAsOAa6ICxAB9gJiA2dYADgLHAMgCyAJdAskCygLLAswAaALOAs9cTlNJ +ZGVudGlmaWVyWU5TVGFiVmlld1dOU0xhYmVsgNiAmYCagA6A1oDVUTHVAFkADgBsAFoAWwArAF8C1ALV +AGGAAICVgNSAm9IADgA9AGYC2IBroQLZgJzdAFkAywAOAGwAzALbAtwAWgLdAFsAXQDNAM4CzALfANEC +4QLiAuMC5ALlAuYC5wLMAukC6lxOU0Nvcm5lclZpZXdfEBBOU0hlYWRlckNsaXBWaWV3XE5TU2Nyb2xs +QW10c4CagM+Ak4DTEDKApoCjgJ1PEBBBIAAAQSAAAEGYAABBmAAAEQESgJqAzYCe0gAOAD0AZgLtgGul +AuoC6QLfAuQC44CegM2Az4CjgKbZAFkADgBsAOAAWgBbAOEA4gBdAtkA5AL2AOcC9wDpAvgC+QLZgJyA +i4DMgJ+AoIC0gJzSAA4APQBmAv2Aa6EC+ICg3xAUAFkDAAAOAGsDAQJKAwIC2wMDAwQDBQBbAFwAkAMG +AwcDCABdAwkDCgLqAHQDDAMNAw4A7AB6AuMDEgE2AxMAYQMUAHoAegMXAFMC6gMZAxpfEB9OU0RyYWdn +aW5nU291cmNlTWFza0Zvck5vbkxvY2FsXE5TSGVhZGVyVmlld18QEk5TQWxsb3dzVHlwZVNlbGVjdF8Q +F05TSW50ZXJjZWxsU3BhY2luZ1dpZHRoXxAZTlNDb2x1bW5BdXRvcmVzaXppbmdTdHlsZV8QGE5TSW50 +ZXJjZWxsU3BhY2luZ0hlaWdodF8QJU5TT3V0bGluZVZpZXdBdXRvc2F2ZUV4cGFuZGVkSXRlbXNLZXlb +TlNHcmlkQ29sb3JfEBxOU0RyYWdnaW5nU291cmNlTWFza0ZvckxvY2FsXk5TVGFibGVDb2x1bW5zW05T +Um93SGVpZ2h0gJ6AyxP/////0sCAAICigHMJgKYjQAgAAAAAAAAjQAAAAAAAAACAoQkJgMiAnoCpI0Ax +AAAAAAAAW3sxMDk3LCA1OTV91gBZAA4AWwBcAF0DHQLkAx8AYQMgAuQC+FtOU1RhYmxlVmlld4CjgKWA +pICjgKDZAFkADgBsAOAAWgBbAOEA4gBdAtkA5AMmAOcDJwDpAw4C+QLZgJyAi4DSgNGAooC0gJxaezEw +OTcsIDE3fdIANwA4Ay0DLqQDLgDIAMkANV8QEU5TVGFibGVIZWFkZXJWaWV31QBZAA4AbABbAF0C2QMx +AzIAYQLZgJyAqICngJxfEBV7ezEwOTgsIDB9LCB7MTYsIDE3fX3SADcAOAM2AzekAzcAyADJADVdX05T +Q29ybmVyVmlld9IADgA9AGYDOoBrpAM7AzwDPQM+gKqAuoC+gMTZA0AADgNBATQDQgNDA0QDRQMdAHoD +RwNIA0kDSgBSA0sDTAL4Xk5TSXNSZXNpemVhYmxlXE5TSGVhZGVyQ2VsbFpOU0RhdGFDZWxsXk5TUmVz +aXppbmdNYXNrWk5TTWluV2lkdGhaTlNNYXhXaWR0aAmAuYCrI0Bu4AAAAAAAgLIjQDAAAAAAAAAjQI9A +AAAAAACAoNcAmwAOAkoAoAChAKQDTwNQA1EDUgNTA1QAdANVW05TVGV4dENvbG9yEgSB/gCAsYCugKyA +rYCvXxAPQ2xhc3MgKyBNb2R1bGVz1AAOALQAtQC2ALcDWQC5A1uAGCNAJgAAAAAAAIAXEQwc0wAOAlcC +WAJZAWcDXoB0SzAuMzMzMzMyOTkA1QAOAl0CVwJqAmsCWQJRAP0DYgJvgHSAdYCwgHpfEA9oZWFkZXJU +ZXh0Q29sb3LSADcAOANmA2elA2cDaADDAI8ANV8QEU5TVGFibGVIZWFkZXJDZWxsXxAPTlNUZXh0Rmll +bGRDZWxs2ACbAA4CSgCgAKEAogCkA08DagNrAvkDbQB2AvgDcANxEhQh/kCAuIC0gLOAFoCgEQgAgLZZ +VGV4dCBDZWxs1QAOAl0CVwJqAmsCWQJtAP0DdgJvgHSAfIC1gHpfEBZjb250cm9sQmFja2dyb3VuZENv +bG9y1QAOAl0CVwJqAmsCWQJRAP0DfAJvgHSAdYC3gHpfEBBjb250cm9sVGV4dENvbG9y0gA3ADgDgANo +pANoAMMAjwA10gA3ADgDggODogODADVdTlNUYWJsZUNvbHVtbtkDQAAOA0EBNANCA0MDRANFAx0AegNH +A4cDiAOJAFIDigNMAvgJgLmAuyNASIAAAAAAAIC9I0BEAAAAAAAAgKDXAJsADgJKAKAAoQCkA08DUANR +A1IDjwNUAHQDVYCxgK6AvICtgK9WT2Zmc2V02ACbAA4CSgCgAKEAogCkA08DagNrAvkDbQB2AvgDcANx +gLiAtICzgBaAoIC22QNAAA4DQQE0A0IDQwNEA0UDHQB6A0cDnQOeA58BZwH2A6AC+AmAuYC/I0B8MAAA +AAAAgMMjR+///6AAAACAoNcAmwAOAkoAoAChAKQDTwNQA1EDpAOlA1QAdANVgLGAwYDAgK2Ar1RUZXh0 +1QAOAl0CVwJqAmsCWQDsAP0DrAJvgHSAc4DCgHpbaGVhZGVyQ29sb3LYAJsADgJKAKAAoQCiAKQDTwNq +A2sC+QNtAHYC+ANwA3GAuIC0gLOAFoCggLbZA0AADgNBATQDQgNDA0QDRQMdAHoDRwO5A7oDuwFnAfYD +oAL4CYC5gMUjQHUgAAAAAACAx4Cg1wCbAA4CSgCgAKEApANPA1ADUQOkA8ADVAB0A1WAsYDBgMaArYCv +V01ldGhvZHPYAJsADgJKAKAAoQCiAKQDTwNqA2sC+QNtAHYC+ANwA3GAuIC0gLOAFoCggLbVAA4CXQJX +AmoCawJZA80A/QPOAm+AdIDKgMmAellncmlkQ29sb3LTAA4CVwJYAlkBZwPTgHREMC41ANIANwA4A9UD +1qYD1gMdAMcAyADJADVdTlNPdXRsaW5lVmlld18QFnt7MSwgMTd9LCB7MTA5NywgNTk1fX3YAFkCnQAO +AGwAWwKeAF0CnwLZAtkCogPcAGECpQLZA9+AnICcgI+AzoCOgJwjP+/yO2AAAABfEBd7ezEwOTgsIDE3 +fSwgezE1LCA1OTV9fdkAWQKdAA4AbADMAFsCngBdAp8C2QLZAqID5QE2AGECpQLZA+iAnICcgI+A0ICO +gJwjP+/4igAAAABfEBZ7ezEsIDYxMn0sIHsxMDk3LCAxNX190gAOAD0AZgPsgGuhAw6Aol8QFHt7MSwg +MH0sIHsxMDk3LCAxN319XxAXe3stMywgLTN9LCB7MTExNCwgNjI4fX1bU3ludGF4IFRyZWXVAA4CXQJX +AmoCawJZAm0A/QP0Am+AdIB8gNeAelxjb250cm9sQ29sb3LSADcAOAP4A/miA/kANV1OU1RhYlZpZXdJ +dGVt1gAOAscAyALIAl0CyQLKA/wAgQBoAs4EAIDYgNqAEIAOgNaA21EyVUlucHV00gA3ADgEBALIpALI +AMgAyQA1W3sxMTEyLCA2NzB9XxAWe3swLCAwfSwgezE2ODAsIDEwMjh9fdIANwA4BAgECaIECQA1XxAQ +TlNXaW5kb3dUZW1wbGF0ZdIADgA9AGYEDIBrqgQNBA4EDwQQBBEEEgQTBBQEFQQWgOKA84D+gQEBgQEE +gQEHgQEKgQERgQEXgQEe1wAOBBgEGQQaBBsCyQQcBB0EHgQfBCADPQQiAFJdTlNEZXN0aW5hdGlvbllO +U0tleVBhdGhZTlNCaW5kaW5nWE5TU291cmNlXxAcTlNOaWJCaW5kaW5nQ29ubmVjdG9yVmVyc2lvboDy +gOOA8YDwgL6A79gADgQkBCUEJgQnBCgEKQQqBCsAegQtAHoELwB6BDEAel8QFE5TUHJlc2VydmVzU2Vs +ZWN0aW9uXxAPX05TTWFuYWdlZFByb3h5Wk5TRWRpdGFibGVeTlNEZWNsYXJlZEtleXNfEBhOU1NlbGVj +dHNJbnNlcnRlZE9iamVjdHNfEBhOU1RyZWVDb250ZW50Q2hpbGRyZW5LZXlfEBZOU0F2b2lkc0VtcHR5 +U2VsZWN0aW9ugO4JgOsJgOQJgO0J0gAOAD0AZgQ1gGunBDYENwQ4BDkEOgCoBDyA5YDmgOeA6IDpgBmA +6l8QEWNsYXNzX2FuZF9tb2R1bGVzVm9mZnNldFp0ZXh0X3ZhbHVlV21ldGhvZHNaY29udHJvbGxlclpn +ZXRJbmRleGVz0QAOBESA7NIANwA4BEYEJaIEJQA1WGVsZW1lbnRz0gA3ADgESQRKpARKBEsETAA1XxAQ +TlNUcmVlQ29udHJvbGxlcl8QEk5TT2JqZWN0Q29udHJvbGxlclxOU0NvbnRyb2xsZXJfECF2YWx1ZTog +YXJyYW5nZWRPYmplY3RzLnRleHRfdmFsdWVVdmFsdWVfEBphcnJhbmdlZE9iamVjdHMudGV4dF92YWx1 +ZdIANwA4BFEEUqMEUgRTADVfEBVOU05pYkJpbmRpbmdDb25uZWN0b3JeTlNOaWJDb25uZWN0b3LXAA4E +GAQZBBoEGwLJBBwEHQAfBFcEWARZBFoAUoDygAKA/YD8gPSA+9QADgQlBCYEJwRcBF0AegRfgPqA+QmA +9dIADgA9AGYEYoBrpARjBGQEOgRmgPaA94DpgPhVaW5wdXRbc3ludGF4X3RyZWVcc2VsZWN0ZWRfdGFi +0QAOBESA7NIANwA4BG0ES6MESwRMADVfEBljb250ZW50T2JqZWN0OiBwYXJhbWV0ZXJzXWNvbnRlbnRP +YmplY3RacGFyYW1ldGVyc9cADgQYBBkEGgQbAskEHAQdBB4EdAQgAzwEdwBSgPKA44EBAIDwgLqA/18Q +HXZhbHVlOiBhcnJhbmdlZE9iamVjdHMub2Zmc2V0XxAWYXJyYW5nZWRPYmplY3RzLm9mZnNldNcADgQY +BBkEGgQbAskEHAQdBB4EfQQgAzsEgABSgPKA44EBA4DwgKqBAQJfECh2YWx1ZTogYXJyYW5nZWRPYmpl +Y3RzLmNsYXNzX2FuZF9tb2R1bGVzXxAhYXJyYW5nZWRPYmplY3RzLmNsYXNzX2FuZF9tb2R1bGVz1wAO +BBgEGQQaBBsCyQQcBB0EWQSGBFgEHgSJAFKA8oD0gQEGgPyA44EBBV8QJGNvbnRlbnRPYmplY3Q6IHNl +bGVjdGlvbi5zeW50YXhfdHJlZV8QFXNlbGVjdGlvbi5zeW50YXhfdHJlZdcADgQYBBkEGgQbAskEHAQd +BB4EjwQgAz4EkgBSgPKA44EBCYDwgMSBAQhfEB52YWx1ZTogYXJyYW5nZWRPYmplY3RzLm1ldGhvZHNf +EBdhcnJhbmdlZE9iamVjdHMubWV0aG9kc9gADgQYBBkEGgQbAskElgQcBB0EWQSZBJoAjAScBJ0AUllO +U09wdGlvbnOA8oD0gQENgQEMgBKBAQuBAQ5fEBlhcmd1bWVudDogc2VsZWN0aW9uLmlucHV0WGFyZ3Vt +ZW50XxAPc2VsZWN0aW9uLmlucHV00wAOAVkAPQFaBKMEpYBloQSkgQEPoQSmgQEQXk5TU2VsZWN0b3JO +YW1lXxAPcmV0dXJuQXJndW1lbnQ62QAOBBgEGQQaBKoEGwLJBJYEHAQdBFkErQSuBBMAjASxBLIAUl8Q +E05TUHJldmlvdXNDb25uZWN0b3KA8oD0gQEUgQETgQEKgBKBARKBARVfEBx0YXJnZXQ6IHNlbGVjdGlv +bi5jb250cm9sbGVyVnRhcmdldF8QFHNlbGVjdGlvbi5jb250cm9sbGVy0wAOAVkAPQFaBLgEuoBloQSk +gQEPoQS7gQEW2AAOBBgEGQQaBBsCyQSWBBwEHQRZBL8EwADqBMIEwwBSgPKA9IEBGoEBGYAhgQEYgQEb +XxAWdmFsdWU6IHNlbGVjdGlvbi5pbnB1dNMADgFZAD0BWgTHBMmAZaEEyIEBHKEEyoEBHV8QJk5TQWx3 +YXlzUHJlc2VudHNBcHBsaWNhdGlvbk1vZGFsQWxlcnRzCdcADgQYBBkEGgQbAskEHAQdBFkE0ATRAGgE +0wBSgPKA9IEBIYEBIIAOgQEfXxAlc2VsZWN0ZWRMYWJlbDogc2VsZWN0aW9uLnNlbGVjdGVkX3RhYl1z +ZWxlY3RlZExhYmVsXxAWc2VsZWN0aW9uLnNlbGVjdGVkX3RhYtIADgA9AWkE2YBirxAdA7sDPALMAtkA +SwCMAzsCxATiAz4AfQM9A4kAaACBAvgAjQOfANYDSgMOAOoC3wLpAEAEWQCUANAEHoDHgLqAmoCcgAuA +EoCqgJiBASOAxIDZgL6AvYAOgBCAoIAdgMOAjICygKKAIYDPgM2AB4D0gBSAkIDj0gAOADIAMwT5gASB +ASRdTlNBcHBsaWNhdGlvbtIADgA9AWkE/YBirxAdAz4C+ALEAswAQACBAvgAaAAfAvgAaAL4AzwASwB9 +AtkAgQM9AI0DOwLZAI0C2QLZAB8AHwCMAI0AH4DEgKCAmICagAeAEICggA6AAoCggA6AoIC6gAuA2YCc +gBCAvoAdgKqAnIAdgJyAnIACgAKAEoAdgALSAA4APQFpBR2AYq8QHgAfAzwDuwLMAtkASwCMAzsCxATi +Az4AfQM9A4kAaACBAvgAjQNKANYDnwMOAt8C6QDqAEAEWQCUANAEHoACgLqAx4CagJyAC4ASgKqAmIEB +I4DEgNmAvoC9gA6AEICggB2AsoCMgMOAooDPgM2AIYAHgPSAFICQgOPSAA4APQFpBT6AYq8QHgU/BUAF +QQVCBUMFRAVFBUYFRwVIBUkFSgVLBUwFTQVOBU8FUAVRBVIFUwVUBVUFVgVXBVgFWQVaBVsFXIEBKIEB +KYEBKoEBK4EBLIEBLYEBLoEBL4EBMIEBMYEBMoEBM4EBNIEBNYEBNoEBN4EBOIEBOYEBOoEBO4EBPIEB +PYEBPoEBP4EBQIEBQYEBQoEBQ4EBRIEBRVxGaWxlJ3MgT3duZXJfEBVUYWJsZSBDb2x1bW4gKE9mZnNl +dClfEB1UZXh0IEZpZWxkIENlbGwgKFRleHQgQ2VsbCktMlRWaWV3W1Njcm9sbCBWaWV3XENvbnRlbnQg +Vmlld18QEVB1c2ggQnV0dG9uIChSdW4pXxAeVGFibGUgQ29sdW1uIChDbGFzcyArIE1vZHVsZXMpXxAb +VGFiIFZpZXcgSXRlbSAoU3ludGF4IFRyZWUpW0FwcGxpY2F0aW9uXxAWVGFibGUgQ29sdW1uIChNZXRo +b2RzKV8QFVRhYiBWaWV3IEl0ZW0gKElucHV0KV8QE1RhYmxlIENvbHVtbiAoVGV4dClfEBtUZXh0IEZp +ZWxkIENlbGwgKFRleHQgQ2VsbClfECFUb3AgVGFiIFZpZXcgKFN5bnRheCBUcmVlLCBJbnB1dClWVmll +dy0xXxA1T3V0bGluZSBWaWV3IChDbGFzcyArIE1vZHVsZXMsIE9mZnNldCwgVGV4dCwgTWV0aG9kcyld +U2Nyb2xsIFZpZXctMV8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxsKS0xXxATVmVydGljYWwgU2Ny +b2xsZXItMV8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxsKS0zXxARVGFibGUgSGVhZGVyIFZpZXdf +EBNIb3Jpem9udGFsIFNjcm9sbGVyXxARVmVydGljYWwgU2Nyb2xsZXJZVGV4dCBWaWV3XxAPV2luZG93 +IChXaW5kb3cpXxART2JqZWN0IENvbnRyb2xsZXJfEBFCdXR0b24gQ2VsbCAoUnVuKV8QFUhvcml6b250 +YWwgU2Nyb2xsZXItMV8QD1RyZWUgQ29udHJvbGxlctIADgA9AWkFfYBioNIADgA9AWkFgIBioNIADgA9 +AWkFg4BirxAoBA0AHwO7AzwCzALZAEsAjAM7BBUCxATiAz4EFAB9Az0DiQBoAIEEEgL4AI0DnwDWA0oE +EAQPAw4A6gLfAukEFgBABBEEWQCUBBMA0AQOBB6A4oACgMeAuoCagJyAC4ASgKqBAReAmIEBI4DEgQER +gNmAvoC9gA6AEIEBB4CggB2Aw4CMgLKBAQGA/oCigCGAz4DNgQEegAeBAQSA9IAUgQEKgJCA84Dj0gAO +AD0BaQWugGKvECgFrwWwBbEFsgWzBbQFtQW2BbcFuAW5BboFuwW8Bb0FvgW/BcAFwQXCBcMFxAXFBcYF +xwXIBckFygXLBcwFzQXOBc8F0AXRBdIF0wXUBdUF1oEBSoEBS4EBTIEBTYEBToEBT4EBUIEBUYEBUoEB +U4EBVIEBVYEBVoEBV4EBWIEBWYEBWoEBW4EBXIEBXYEBXoEBX4EBYIEBYYEBYoEBY4EBZIEBZYEBZoEB +Z4EBaIEBaYEBaoEBa4EBbIEBbYEBboEBb4EBcIEBcRD0EQETEOsQ5RDYEN8Q0xDdEOQRAQoQ1RP///// +/////RDqEQEQENYQ6BDmENQQ1xD1EOIRAQEQ6REBAhDnEPAQ8hDsEQEEEOEQ4BDSEEoQ3hEBDxEBAxAF +EEjSAA4APQBmBf+Aa6DSAA4APQFpBgKAYqDSAA4APQFpBgWAYqDSADcAOAYHBgiiBggANV5OU0lCT2Jq +ZWN0RGF0YQAIABkAIgAnADEAOgA/AEQAUgBUAGYDVgNcA6cDrgO1A8MD1QPxA/8ECwQXBCUEMAQ+BFoE +aAR7BI0EpwSxBL4EwATDBMYEyQTMBM4E0QTTBNYE2QTcBN8E4QTjBOYE6QTsBO8E+AUEBQYFCAURBRoF +IwUuBTMFQgVVBV4FaQVrBW4FcAWZBaYFswXBBcsF2QXmBfgGDAYYBhoGHAYeBiAGJQYnBikGKwYtBi8G +SgZRBloGdwaJBpQGnQapBrUGtwa5BrsGvgbABsIGxAbNBs8G0gbUBwkHGAciByoHMQdFB14Hdgd4B3oH +fAd+B4AHggeEB4YHiAeJB4sHjAeOB5cHmQecB54Huwe9B78HwQfDB8UHxwfQB9IH1wfZB9sH/AgDCA0I +DwgRCBMIFQgYCBkIGwgdCDUIZghyCIgInQisCL4IyQjTCOEI8wkACQ4JEwkVCRcJGQkeCSAJIgkkCSYJ +KAktCTYJOglLCVIJWQliCWQJbQlvCXIJfwmICY0JjgmQCZkJogmvCbwJxQnQCdkJ4wnqCfYKIwovCjgK +RApSClQKVgpYCloKXApeCmAKYgpkCm0Kbwp2CngKegp8CqkKsgq8CsYK0ArSCtQK1grYCtoK3ArfCuEK +4wrlCucK8AryCvUK9wssCz4LSAtVC2ELawt0C38LgQuDC4ULhwuJC4sLjguQC5ILlAuWC5gLmgujC6UL +ygvMC84L0AvSC9QL1gvYC9oL3AveC+AL4gvkC+YL6AvqC+wMCAwdDDoMWwx3DJ0MuwzhDP0NGQ02DU4N +gg2cDbkN1Q4CDgsOEg4fDiUOMA5FDk8OWg5iDnQOdg54DnoOgw6FDpoOrQ67DsUOxw7JDssOzQ7iDu8O ++A8KDwwPDg8QDxIPFA8dDycPKRGLEZQRmxGtEbYRuBG9Eb8RwRHOEdYR2BHdEd8R4RHmEegR6hH9EgoS +FRIhEiMSJRInEjASMhJ1EncSeRJ7En0SfxKBEoMShRKHEokSixKNEo8SkRKTEpUSlxKZEpsSnRKfEqES +oxKlEqcSqRKrEq0SrxKxErMStRK+EskSyxLUEt0S4hLsEvUS9xMAEwkTCxMUEx0THxMoEzETMxM8E0UT +RxNQE1kTWxNkE20TbxN4E4ETgxOME5UTlxOgE6kTqxO0E70TvxPIE9ET0xPcE+UT5xPwE/kT+xQEFA0U +DxQYFCEUIxQsFDUUNxRAFEkUSxRUFF0UXxRoFHEUcxR8FIUUhxSQFJkUmxSkFK0UrxS4FMEUwxTMFNUU +1xTgFOkU6xT0FP0U/xUIFREVExUcFSUVJxUwFTkVOxVEFU0VTxVYFWEVZhVuFXcVfBWNFY8VmBWaFZ0V +phWrFbgVxRXHFcwVzhXQFdUV1xXZFeYV6BXqFfMV9RY4FjoWPBY+FkAWQhZEFkYWSBZKFkwWThZQFlIW +VBZWFlgWWhZcFl4WYBZiFmQWZhZoFmoWbBZuFnAWchZ0FnYWeBaJFosWjRaPFqMWrBazFsIWyxbTFtUW +5xbwFvcXBRcMFxUXHhc6F08XWBdaF10XXxdoF20Xdhd7F5wXpBe+F9EX5Rf8GBEYJBgmGCkYKxgtGC8Y +MRgzGDUYQhhPGFcYWRhcGGUYahhyGH8YgRiEGJEYkxiYGJoYnBihGKMYpRi6GMYY1BjWGNgY2hjcGOMZ +ARkOGRAZHBkxGTMZNRk3GTkZTRlaGVwZYRljGWUZahlsGW4ZehmHGY0ZjxmWGZ8ZpBm7GckZ0xncGecZ +7hoGGhMaHRoqGiwaLho2Gj8aRBpNGlYaYRqGGo8amBqiGqQaphqoGqoarBquGrAauRrSGt8a6BrzGv4b +Kxs2GzgbOhs8Gz4bQBtCG0QbTRtWG3EbixuUG50bqhvEG80b1BvvG/gb+hv/HAEcAxwcHCkcMxw7HD0c +PxxBHEMcRRxHHEkcXhxgHGIcZBxmHG8ccRx0HHYcqxy4HMsc2BzaHNwc3hzgHOIc5BzmHOgc+xz+HQAd +Ah0EHQ0dDx0aHRwdHh0gHSIdJB1JHUsdTR1PHVEdUx1VHVcdYB1iHWUdZx26Hdwd6R3+HhgeNB5PHnce +gx6iHrEevR6/HsEeyh7MHs4ezx7RHtoe4x7lHuYe5x7pHuse7R72HwIfGx8nHykfKx8tHy8fMR9WH1gf +Wh9cH14fYB9iH2Qfbx94H4EflR+qH6wfrh+wH7Ifyh/TH9wf6h/zH/Uf/iAAIAIgBCAGICsgOiBHIFIg +YSBsIHcgeCB6IHwghSCHIJAgmSCbILggxCDJIMsgzSDPINEg0yDlIPYg+CEBIQMhBiETIRUhISE2ITgh +OiE8IT4hUCFZIWQheCGKIashsCGyIbQhtiG4IbohvSG/Ickh3iHgIeIh5CHmIf8iFCIWIhgiGiIcIi8i +OCJBIkoiTyJdIoIigyKFIocikCKSIpsinSK6IrwiviLAIsIixCLLIuwi7iLwIvIi9CL2IvgjHSMeIyAj +IiMrIy0jNiM4I1UjVyNZI1sjXSNfI2QjeSN7I30jfyOBI40jriOwI7IjtCO2I7gjuiPfI+Aj4iPkI+0j +7yPxJA4kECQSJBQkFiQYJCAkQSRDJEUkRyRJJEskTSRiJGQkZiRoJGokdCSBJIMkiCSRJJ4krCTFJOYk +6CTqJOwk7iTwJPIk+yUVJTolPCU+JUAlQiVEJUYlTyVoJXElcyV2JXgljyWpJbUlyiXMJc4l0CXSJd8l +6CXtJfsmFCYWJhgmGiYcJh4mICYiJigmMSY6JkYmXyZoJm0mgCaJJosmoCaiJqQmpiapJqwmryayJrUm +uCa7Jtgm5ibwJvonAyciJyQnJicoJyonLCcuJ08nZid4J4MnkietJ8gn4SfjJ+Qn5ifnJ+kn6ifsJ+0n +9if4KAcoCSgLKA0oDygRKBMoFSgpKDAoOyhDKE4oWSheKGAoaShuKHcogCiJKJwosSi+KOIo6CkFKQ4p +FSktKTwpWSlbKV0pXylhKWMpZSl2KXgpeil7KX0phimIKZEpkymVKZcpmSmfKaspuCm9Kb8pyCnPKesp ++SoEKiEqIyolKigqKiosKi4qTipnKoQqhiqIKosqjSqPKpIqvSrhKv4rACsCKwUrBysJKwwrMytLK2gr +aitsK28rcStzK3YrlyuxK9Ir3CveK+Ar4yvmK+gr6yvuLAosEywlLDIsNCw3LDosPSxALE8sYSyGLJws +niygLKMspiypLKssriyxLNAs1yzuLPss/S0ALQMtBi0JLSotLC0uLTEtNC02LTktPC1VLWItZC1nLWot +bS1wLZktmi23Lbktuy2+LcEtwy3GLe4t/C4VLh4uIC5dLl8uYS5jLmUuZy5pLmsubS5wLnIudC52Lngu +ei58Ln4ugC6CLoQuhi6ILooujC6OLpAuki6ULpYumC6hLqMupi60Lr0uvy78Lv4vAC8CLwQvBi8ILwov +DC8OLxAvEi8ULxYvGC8aLxwvHi8gLyIvJC8mLygvKi8sLy4vMC8yLzQvNi8/L0EvgC+CL4Qvhi+IL4ov +jC+OL5Avki+VL5cvmS+bL50vny+hL6MvpS+nL6kvqy+tL68vsS+zL7Uvty+5L7svvS/GL8gwBzAKMA0w +EDATMBYwGTAcMB8wIjAlMCgwKzAuMDEwNDA3MDowPTBAMEMwRjBJMEwwTzBSMFUwWDBbMF4wYTBuMIYw +pjCrMLcwxDDYMPkxFzEjMTwxVDFqMYgxrDGzMesx+TIZMi8yTzJjMnkyjTKXMqkyvTLRMuky+zMEMwYz +BzMQMxIzEzMcMx4zcTNzM3UzdzN5M3szfTN/M4EzgzOGM4gzizONM5AzkjOUM5YzmDOaM50znzOhM6Mz +pTOnM6ozrDOuM7AzsjO0M7czuTO8M74zwDPDM8UzxzPJM9Iz1DQnNCo0LTQwNDM0NjQ5NDw0PzRCNEU0 +SDRLNE40UTRUNFc0WjRdNGA0YzRmNGk0bDRvNHI0dTR4NHs0fjSBNIQ0hzSKNI00kDSTNJY0mTScNJ80 +oTSkNKY0qDSqNKw0rjSwNLI0tTS3NMA0wjTFNMc0yTTLNM00zzTRNNM01jTYNNs03TTfNOE04zTmNOg0 +6jTsNO408DTzNPY0+DT6NQM1BTUGNQ81ETUSNRs1HTUeNSc1LAAAAAAAAAICAAAAAAAABgkAAAAAAAAA +AAAAAAAAADU7A + + + diff --git a/Treetop.tmbundle/Support/nibs/SyntaxTreeViewer.nib/keyedobjects.nib b/Treetop.tmbundle/Support/nibs/SyntaxTreeViewer.nib/keyedobjects.nib new file mode 100644 index 0000000..577bcb0 Binary files /dev/null and b/Treetop.tmbundle/Support/nibs/SyntaxTreeViewer.nib/keyedobjects.nib differ diff --git a/Treetop.tmbundle/Support/syntax_tree_viewer.rb b/Treetop.tmbundle/Support/syntax_tree_viewer.rb new file mode 100644 index 0000000..0fd58c1 --- /dev/null +++ b/Treetop.tmbundle/Support/syntax_tree_viewer.rb @@ -0,0 +1,117 @@ +#!/usr/bin/env ruby +require 'rubygems' +require 'treetop' +require "#{ENV["TM_SUPPORT_PATH"]}/lib/ui" + +# Monkey-patch SyntaxNode in a gross violation of its privacy. +module Treetop + module Runtime + class SyntaxNode + def interesting_methods + # Copied from SyntaxNode#inspect + methods-[extension_modules.last ? extension_modules.last.methods : nil]-self.class.instance_methods + end + + def to_hash + { + "class_and_modules" => self.class.to_s.sub(/.*:/,'') + extension_modules.map{|m| "+"+m.to_s.sub(/.*:/,'')}*"", + "offset" => interval.first, + "text_value" => text_value, + "methods" => interesting_methods * ", ", + "elements" => elements ? elements.map {|e| e.to_hash} : [] + } + end + end + end +end + +class SyntaxTreeViewer + def self.nib_path + File.dirname(__FILE__) + "/SyntaxTreeViewer.nib" + end + + def self.new_with_unknown_grammar + parser = if ENV['TM_SCOPE'] =~ /source\.ruby/ && ENV['TM_SELECTED_TEXT'] + eval(ENV['TM_SELECTED_TEXT']) + else + parser_file = if ENV['TM_SCOPE'] =~ /source\.treetop/ + ENV['TM_FILEPATH'] + else + ask_for_grammar + end + return unless parser_file + Treetop.load(parser_file) + end + new(parser.new) + end + + def self.ask_for_grammar + files = TextMate::UI.request_file("title" => "Select a Grammar File") + if files.nil? || files.empty? + nil + else + files[0] + end + end + + def self.nib_path + File.dirname(__FILE__) + "/nibs/SyntaxTreeViewer.nib" + end + + def initialize(_parser) + @parser = _parser + run_parser! + end + + def dialog + TextMate::UI.dialog( + :nib => self.class.nib_path, + :parameters => parameters + ) do |d| + d.wait_for_input do |params| + if params["returnArgument"] + self.input = params["returnArgument"] + run_parser! + d.parameters = parameters + true + else + false + end + end + end + end + + def input + ENV['TM_TREETOP_SYNTAX_VIEWER_INPUT'] ||= "" + end + + def input=(new_input) + ENV['TM_TREETOP_SYNTAX_VIEWER_INPUT'] = new_input + end + + private + def run_parser! + if input && !input.empty? + @syntax_tree = @parser.parse(input) + TextMate::UI.alert(:warning, "Parse error", @parser.failure_reason) unless @syntax_tree + end + end + + def parameters + p = { + "input" => input, + "syntax_tree" => @syntax_tree ? @syntax_tree.to_hash : {}, + "selected_tab" => !input.empty? && @syntax_tree ? "Syntax Tree" : "Input" + } + puts p + p + end +end + +if __FILE__ == $0 + Dir.chdir("/Users/aobrien/Work/canopy/play/sparql/") + require "/Users/aobrien/Work/canopy/play/sparql/lib/sparql" + v = SyntaxTreeViewer.new(SparqlParser.new) + v.input = %{PREFIX foaf: SELECT ?foo WHERE { ?x foaf:knows ?y . ?z foaf:knows ?x .}} + v.dialog +end