Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCg0KI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BERldpbmRvdy5oIg0KI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9XbmQuaCINCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oIg0KDQojZGVmaW5lIERFRkFVTFRfRk9OVF9OQU1FCQkJIkhlbHZldGljYSINCg0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfRm9udE1hcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0KQ1BXTF9Gb250TWFwOjpDUFdMX0ZvbnRNYXAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyKSA6IAkNCgltX3BQREZEb2MoTlVMTCksDQoJbV9wU3lzdGVtSGFuZGxlcihwU3lzdGVtSGFuZGxlcikNCnsNCglBU1NFUlQobV9wU3lzdGVtSGFuZGxlciAhPSBOVUxMKTsNCn0NCg0KQ1BXTF9Gb250TWFwOjp+Q1BXTF9Gb250TWFwKCkNCnsNCglpZiAobV9wUERGRG9jKQ0KCXsNCgkJZGVsZXRlIG1fcFBERkRvYzsNCgkJbV9wUERGRG9jID0gTlVMTDsNCgl9DQoNCglFbXB0eSgpOw0KfQ0KDQp2b2lkIENQV0xfRm9udE1hcDo6U2V0U3lzdGVtSGFuZGxlcihJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpDQp7DQoJbV9wU3lzdGVtSGFuZGxlciA9IHBTeXN0ZW1IYW5kbGVyOw0KfQ0KDQpDUERGX0RvY3VtZW50KiBDUFdMX0ZvbnRNYXA6OkdldERvY3VtZW50KCkNCnsNCglpZiAoIW1fcFBERkRvYykNCgl7DQoJCWlmIChDUERGX01vZHVsZU1ncjo6R2V0KCkpDQoJCXsNCgkJCW1fcFBERkRvYyA9IEZYX05FVyBDUERGX0RvY3VtZW50Ow0KCQkJbV9wUERGRG9jLT5DcmVhdGVOZXdEb2MoKTsNCgkJfQ0KCX0NCg0KCXJldHVybiBtX3BQREZEb2M7DQp9DQoNCkNQREZfRm9udCogQ1BXTF9Gb250TWFwOjpHZXRQREZGb250KEZYX0lOVDMyIG5Gb250SW5kZXgpDQp7DQoJaWYgKG5Gb250SW5kZXggPj0wICYmIG5Gb250SW5kZXggPCBtX2FEYXRhLkdldFNpemUoKSkNCgl7DQoJCWlmIChDUFdMX0ZvbnRNYXBfRGF0YSogcERhdGEgPSBtX2FEYXRhLkdldEF0KG5Gb250SW5kZXgpKQ0KCQl7DQoJCQlyZXR1cm4gcERhdGEtPnBGb250Ow0KCQl9DQoJfQ0KDQoJcmV0dXJuIE5VTEw7DQp9DQoNCkNGWF9CeXRlU3RyaW5nIENQV0xfRm9udE1hcDo6R2V0UERGRm9udEFsaWFzKEZYX0lOVDMyIG5Gb250SW5kZXgpDQp7DQoJaWYgKG5Gb250SW5kZXggPj0wICYmIG5Gb250SW5kZXggPCBtX2FEYXRhLkdldFNpemUoKSkNCgl7DQoJCWlmIChDUFdMX0ZvbnRNYXBfRGF0YSogcERhdGEgPSBtX2FEYXRhLkdldEF0KG5Gb250SW5kZXgpKQ0KCQl7DQoJCQlyZXR1cm4gcERhdGEtPnNGb250TmFtZTsNCgkJfQ0KCX0NCg0KCXJldHVybiAiIjsNCn0NCg0KRlhfQk9PTCBDUFdMX0ZvbnRNYXA6Oktub3dXb3JkKEZYX0lOVDMyIG5Gb250SW5kZXgsIEZYX1dPUkQgd29yZCkNCnsNCglpZiAobkZvbnRJbmRleCA+PTAgJiYgbkZvbnRJbmRleCA8IG1fYURhdGEuR2V0U2l6ZSgpKQ0KCXsNCgkJaWYgKG1fYURhdGEuR2V0QXQobkZvbnRJbmRleCkpDQoJCXsJDQoJCQlyZXR1cm4gQ2hhckNvZGVGcm9tVW5pY29kZShuRm9udEluZGV4LCB3b3JkKSA+PSAwOw0KCQl9DQoJfQ0KDQoJcmV0dXJuIEZBTFNFOw0KfQ0KDQpGWF9JTlQzMiBDUFdMX0ZvbnRNYXA6OkdldFdvcmRGb250SW5kZXgoRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBuQ2hhcnNldCwgRlhfSU5UMzIgbkZvbnRJbmRleCkNCnsNCglpZiAobkZvbnRJbmRleCA+IDApDQoJew0KCQlpZiAoS25vd1dvcmQobkZvbnRJbmRleCwgd29yZCkpDQoJCQlyZXR1cm4gbkZvbnRJbmRleDsNCgl9DQoJZWxzZQ0KCXsNCgkJaWYgKGNvbnN0IENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IEdldEZvbnRNYXBEYXRhKDApKQ0KCQl7DQoJCQlpZiAobkNoYXJzZXQgPT0gREVGQVVMVF9DSEFSU0VUIHx8IA0KCQkJCXBEYXRhLT5uQ2hhcnNldCA9PSBTWU1CT0xfQ0hBUlNFVCB8fCANCgkJCQluQ2hhcnNldCA9PSBwRGF0YS0+bkNoYXJzZXQpDQoJCQl7DQoJCQkJaWYgKEtub3dXb3JkKDAsIHdvcmQpKQ0KCQkJCXsNCgkJCQkJcmV0dXJuIDA7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KDQoJRlhfSU5UMzIgbk5ld0ZvbnRJbmRleCA9IC0xOw0KDQoJbk5ld0ZvbnRJbmRleCA9IHRoaXMtPkdldEZvbnRJbmRleChHZXROYXRpdmVGb250TmFtZShuQ2hhcnNldCksIG5DaGFyc2V0LCBUUlVFKTsNCglpZiAobk5ld0ZvbnRJbmRleCA+PSAwKQ0KCXsNCgkJaWYgKEtub3dXb3JkKG5OZXdGb250SW5kZXgsIHdvcmQpKQ0KCQkJcmV0dXJuIG5OZXdGb250SW5kZXg7DQoJfQ0KDQoJbk5ld0ZvbnRJbmRleCA9IHRoaXMtPkdldEZvbnRJbmRleCgiQXJpYWwgVW5pY29kZSBNUyIsIERFRkFVTFRfQ0hBUlNFVCwgRkFMU0UpOw0KCWlmIChuTmV3Rm9udEluZGV4ID49IDApDQoJew0KCQlpZiAoS25vd1dvcmQobk5ld0ZvbnRJbmRleCwgd29yZCkpDQoJCXJldHVybiBuTmV3Rm9udEluZGV4Ow0KCX0NCg0KCXJldHVybiAtMTsNCn0NCg0KRlhfSU5UMzIgQ1BXTF9Gb250TWFwOjpDaGFyQ29kZUZyb21Vbmljb2RlKEZYX0lOVDMyIG5Gb250SW5kZXgsIEZYX1dPUkQgd29yZCkNCnsNCglpZiAoQ1BXTF9Gb250TWFwX0RhdGEqIHBEYXRhID0gbV9hRGF0YS5HZXRBdChuRm9udEluZGV4KSkNCgl7DQoJCWlmIChwRGF0YS0+cEZvbnQpDQoJCXsNCgkJCWlmIChwRGF0YS0+cEZvbnQtPklzVW5pY29kZUNvbXBhdGlibGUoKSkNCgkJCXsNCgkJCQlpbnQgbkNoYXJDb2RlID0gcERhdGEtPnBGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKHdvcmQpOw0KCQkJCXBEYXRhLT5wRm9udC0+R2x5cGhGcm9tQ2hhckNvZGUobkNoYXJDb2RlKTsNCgkJCQlyZXR1cm4gbkNoYXJDb2RlOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCWlmICh3b3JkIDwgMHhGRikNCgkJCQkJcmV0dXJuIHdvcmQ7DQoJCQl9DQoJCX0NCgl9DQoNCglyZXR1cm4gLTE7DQp9DQoNCkNGWF9CeXRlU3RyaW5nIENQV0xfRm9udE1hcDo6R2V0TmF0aXZlRm9udE5hbWUoRlhfSU5UMzIgbkNoYXJzZXQpDQp7DQoJLy9zZWFyY2hpbmcgbmF0aXZlIGZvbnQgaXMgc2xvdywgc28gd2UgbXVzdCBzYXZlIHRpbWUNCglmb3IgKEZYX0lOVDMyIGk9MCxzej1tX2FOYXRpdmVGb250LkdldFNpemUoKTsgaTxzejsgaSsrKQ0KCXsNCgkJaWYgKENQV0xfRm9udE1hcF9OYXRpdmUqIHBEYXRhID0gbV9hTmF0aXZlRm9udC5HZXRBdChpKSkNCgkJew0KCQkJaWYgKHBEYXRhLT5uQ2hhcnNldCA9PSBuQ2hhcnNldCkNCgkJCQlyZXR1cm4gcERhdGEtPnNGb250TmFtZTsNCgkJfQ0KCX0NCg0KCUNGWF9CeXRlU3RyaW5nIHNOZXcgPSBHZXROYXRpdmVGb250KG5DaGFyc2V0KTsNCg0KCWlmICghc05ldy5Jc0VtcHR5KCkpDQoJew0KCQlDUFdMX0ZvbnRNYXBfTmF0aXZlKiBwTmV3RGF0YSA9IG5ldyBDUFdMX0ZvbnRNYXBfTmF0aXZlOw0KCQlwTmV3RGF0YS0+bkNoYXJzZXQgPSBuQ2hhcnNldDsNCgkJcE5ld0RhdGEtPnNGb250TmFtZSA9IHNOZXc7DQoNCgkJbV9hTmF0aXZlRm9udC5BZGQocE5ld0RhdGEpOw0KCX0NCg0KCXJldHVybiBzTmV3Ow0KfQ0KDQp2b2lkIENQV0xfRm9udE1hcDo6RW1wdHkoKQ0Kew0KCXsNCgkJZm9yIChGWF9JTlQzMiBpPTAsIHN6PW1fYURhdGEuR2V0U2l6ZSgpOyBpPHN6OyBpKyspDQoJCQlkZWxldGUgbV9hRGF0YS5HZXRBdChpKTsNCg0KCQltX2FEYXRhLlJlbW92ZUFsbCgpOw0KCX0NCgl7DQoJCWZvciAoRlhfSU5UMzIgaT0wLCBzej1tX2FOYXRpdmVGb250LkdldFNpemUoKTsgaTxzejsgaSsrKQ0KCQkJZGVsZXRlIG1fYU5hdGl2ZUZvbnQuR2V0QXQoaSk7DQoNCgkJbV9hTmF0aXZlRm9udC5SZW1vdmVBbGwoKTsNCgl9DQp9DQoNCnZvaWQgQ1BXTF9Gb250TWFwOjpJbml0aWFsKEZYX0xQQ1NUUiBmb250bmFtZSkNCnsNCglDRlhfQnl0ZVN0cmluZyBzRm9udE5hbWUgPSBmb250bmFtZTsNCg0KCWlmIChzRm9udE5hbWUuSXNFbXB0eSgpKQ0KCQlzRm9udE5hbWUgPSBERUZBVUxUX0ZPTlRfTkFNRTsNCg0KCUdldEZvbnRJbmRleChzRm9udE5hbWUsIEFOU0lfQ0hBUlNFVCwgRkFMU0UpOw0KDQoJLy9HZXRGb250SW5kZXgodGhpcy0+R2V0TmF0aXZlRm9udE5hbWUobkNoYXJzZXQpLCBuQ2hhcnNldCk7DQp9DQoJDQoNCi8qDQpMaXN0IG9mIGN1cnJlbnRseSBzdXBwb3J0ZWQgc3RhbmRhcmQgZm9udHM6DQpDb3VyaWVyLCBDb3VyaWVyLUJvbGQsIENvdXJpZXItQm9sZE9ibGlxdWUsIENvdXJpZXItT2JsaXF1ZQ0KSGVsdmV0aWNhLCBIZWx2ZXRpY2EtQm9sZCwgSGVsdmV0aWNhLUJvbGRPYmxpcXVlLCBIZWx2ZXRpY2EtT2JsaXF1ZQ0KVGltZXMtUm9tYW4sIFRpbWVzLUJvbGQsIFRpbWVzLUl0YWxpYywgVGltZXMtQm9sZEl0YWxpYw0KU3ltYm9sLCBaYXBmRGluZ2JhdHMNCiovDQoNCmNvbnN0IGNoYXIqIGdfc0RFU3RhbmRhcmRGb250TmFtZVtdID0geyJDb3VyaWVyIiwgIkNvdXJpZXItQm9sZCIsICJDb3VyaWVyLUJvbGRPYmxpcXVlIiwgIkNvdXJpZXItT2JsaXF1ZSIsDQoJIkhlbHZldGljYSIsICJIZWx2ZXRpY2EtQm9sZCIsICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiLCAiSGVsdmV0aWNhLU9ibGlxdWUiLA0KCSJUaW1lcy1Sb21hbiIsICJUaW1lcy1Cb2xkIiwgIlRpbWVzLUl0YWxpYyIsICJUaW1lcy1Cb2xkSXRhbGljIiwNCgkiU3ltYm9sIiwgIlphcGZEaW5nYmF0cyJ9Ow0KDQpGWF9CT09MCUNQV0xfRm9udE1hcDo6SXNTdGFuZGFyZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSkNCnsNCglmb3IgKEZYX0lOVDMyIGk9MDsgaTwxNDsgaSsrKQ0KCXsNCgkJaWYgKHNGb250TmFtZSA9PSBnX3NERVN0YW5kYXJkRm9udE5hbWVbaV0pDQoJCQlyZXR1cm4gVFJVRTsNCgl9DQoNCglyZXR1cm4gRkFMU0U7DQp9DQoNCkZYX0lOVDMyIENQV0xfRm9udE1hcDo6RmluZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwgRlhfSU5UMzIgbkNoYXJzZXQpDQp7DQoJZm9yIChGWF9JTlQzMiBpPTAsc3o9bV9hRGF0YS5HZXRTaXplKCk7IGk8c3o7IGkrKykNCgl7DQoJCWlmIChDUFdMX0ZvbnRNYXBfRGF0YSogcERhdGEgPSBtX2FEYXRhLkdldEF0KGkpKQ0KCQl7DQoJCQlpZiAobkNoYXJzZXQgPT0gREVGQVVMVF9DSEFSU0VUIHx8IG5DaGFyc2V0ID09IHBEYXRhLT5uQ2hhcnNldCkNCgkJCXsNCgkJCQlpZiAoc0ZvbnROYW1lLklzRW1wdHkoKSB8fCBwRGF0YS0+c0ZvbnROYW1lID09IHNGb250TmFtZSkNCgkJCQkJcmV0dXJuIGk7DQoJCQl9DQoJCX0NCgl9DQoNCglyZXR1cm4gLTE7DQp9DQoNCkZYX0lOVDMyIENQV0xfRm9udE1hcDo6R2V0Rm9udEluZGV4KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsIEZYX0lOVDMyIG5DaGFyc2V0LCBGWF9CT09MIGJGaW5kKQ0Kew0KCUZYX0lOVDMyIG5Gb250SW5kZXggPSBGaW5kRm9udChFbmNvZGVGb250QWxpYXMoc0ZvbnROYW1lLCBuQ2hhcnNldCksIG5DaGFyc2V0KTsNCglpZiAobkZvbnRJbmRleCA+PSAwKSByZXR1cm4gbkZvbnRJbmRleDsNCg0KLy8JbkZvbnRJbmRleCA9IEZpbmRGb250KCIiLCBuQ2hhcnNldCk7DQovLwlpZiAobkZvbnRJbmRleCA+PSAwKSByZXR1cm4gbkZvbnRJbmRleDsNCg0KCUNGWF9CeXRlU3RyaW5nIHNBbGlhczsNCglDUERGX0ZvbnQqIHBGb250ID0gTlVMTDsNCg0KCWlmIChiRmluZCkNCgkJcEZvbnQgPSBGaW5kRm9udFNhbWVDaGFyc2V0KHNBbGlhcywgbkNoYXJzZXQpOw0KDQoJaWYgKCFwRm9udCkNCgl7DQoJCUNGWF9CeXRlU3RyaW5nIHNUZW1wID0gc0ZvbnROYW1lOw0KCQlwRm9udCA9IEFkZEZvbnRUb0RvY3VtZW50KEdldERvY3VtZW50KCksIHNUZW1wLCBuQ2hhcnNldCk7DQoNCgkJLyoNCgkJaWYgKEZpbmRGb250KHNBbGlhcykpDQoJCXsNCgkJCXNBbGlhcyA9IEVuY29kZUZvbnRBbGlhcyhzVGVtcCwgbkNoYXJzZXQpOw0KCQl9DQoJCWVsc2UNCgkJKi8NCgkJew0KCQkJc0FsaWFzID0gRW5jb2RlRm9udEFsaWFzKHNUZW1wLCBuQ2hhcnNldCk7DQoJCX0JCQ0KCX0NCg0KCUFkZGVkRm9udChwRm9udCwgc0FsaWFzKTsNCg0KCXJldHVybiBBZGRGb250RGF0YShwRm9udCwgc0FsaWFzLCBuQ2hhcnNldCk7DQp9DQoNCkZYX0lOVDMyIENQV0xfRm9udE1hcDo6R2V0UFdMRm9udEluZGV4KEZYX1dPUkQgd29yZCwgRlhfSU5UMzIgbkNoYXJzZXQpDQp7DQoJRlhfSU5UMzIgbkZpbmQgPSAtMTsNCg0KCWZvciAoRlhfSU5UMzIgaT0wLHN6PW1fYURhdGEuR2V0U2l6ZSgpOyBpPHN6OyBpKyspDQoJew0KCQlpZiAoQ1BXTF9Gb250TWFwX0RhdGEqIHBEYXRhID0gbV9hRGF0YS5HZXRBdChpKSkNCgkJew0KCQkJaWYgKHBEYXRhLT5uQ2hhcnNldCA9PSBuQ2hhcnNldCkNCgkJCXsNCgkJCQluRmluZCA9IGk7DQoJCQkJYnJlYWs7DQoJCQl9DQoJCX0NCgl9DQoNCglDUERGX0ZvbnQqIHBOZXdGb250ID0gR2V0UERGRm9udChuRmluZCk7DQoNCglpZiAoIXBOZXdGb250KSByZXR1cm4gLTE7DQoNCgkvKg0KCWlmIChDUERGX0ZvbnQqIHBGb250ID0gR2V0UERGRm9udChuRmluZCkpDQoJew0KCQlQV0xGb250LkFkZFdvcmRUb0ZvbnREaWN0KHBGb250RGljdCwgd29yZCk7DQoJfQ0KCSovDQoNCiNpZmRlZiBGT1hJVF9DSFJPTUVfQlVJTEQNCiAgQ0ZYX0J5dGVTdHJpbmcgc0FsaWFzID0gRW5jb2RlRm9udEFsaWFzKCJBcmlhbF9DaHJvbWUiLCBuQ2hhcnNldCk7DQojZWxzZQ0KCUNGWF9CeXRlU3RyaW5nIHNBbGlhcyA9IEVuY29kZUZvbnRBbGlhcygiQXJpYWxfRm94aXQiLCBuQ2hhcnNldCk7DQojZW5kaWYNCglBZGRlZEZvbnQocE5ld0ZvbnQsIHNBbGlhcyk7DQoNCglyZXR1cm4gQWRkRm9udERhdGEocE5ld0ZvbnQsIHNBbGlhcywgbkNoYXJzZXQpOw0KfQ0KDQpDUERGX0ZvbnQqIENQV0xfRm9udE1hcDo6RmluZEZvbnRTYW1lQ2hhcnNldChDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcywgRlhfSU5UMzIgbkNoYXJzZXQpDQp7DQoJcmV0dXJuIE5VTEw7DQp9DQoNCkZYX0lOVDMyIENQV0xfRm9udE1hcDo6QWRkRm9udERhdGEoQ1BERl9Gb250KiBwRm9udCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMsIEZYX0lOVDMyIG5DaGFyc2V0KQ0Kew0KCUNQV0xfRm9udE1hcF9EYXRhKiBwTmV3RGF0YSA9IG5ldyBDUFdMX0ZvbnRNYXBfRGF0YTsNCglwTmV3RGF0YS0+cEZvbnQgPSBwRm9udDsNCglwTmV3RGF0YS0+c0ZvbnROYW1lID0gc0ZvbnRBbGlhczsNCglwTmV3RGF0YS0+bkNoYXJzZXQgPSBuQ2hhcnNldDsNCg0KCW1fYURhdGEuQWRkKHBOZXdEYXRhKTsNCg0KCXJldHVybiBtX2FEYXRhLkdldFNpemUoKSAtMTsNCn0NCg0Kdm9pZCBDUFdMX0ZvbnRNYXA6OkFkZGVkRm9udChDUERGX0ZvbnQqIHBGb250LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcykNCnsNCn0NCg0KQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpHZXRGb250TmFtZShGWF9JTlQzMiBuRm9udEluZGV4KQ0Kew0KCWlmIChuRm9udEluZGV4ID49MCAmJiBuRm9udEluZGV4IDwgbV9hRGF0YS5HZXRTaXplKCkpDQoJew0KCQlpZiAoQ1BXTF9Gb250TWFwX0RhdGEqIHBEYXRhID0gbV9hRGF0YS5HZXRBdChuRm9udEluZGV4KSkNCgkJew0KCQkJcmV0dXJuIHBEYXRhLT5zRm9udE5hbWU7DQoJCX0NCgl9DQoNCglyZXR1cm4gIiI7DQp9DQoNCkNGWF9CeXRlU3RyaW5nIENQV0xfRm9udE1hcDo6R2V0TmF0aXZlRm9udChGWF9JTlQzMiBuQ2hhcnNldCkNCnsNCglDRlhfQnl0ZVN0cmluZyBzRm9udE5hbWU7DQoNCglpZiAobkNoYXJzZXQgPT0gREVGQVVMVF9DSEFSU0VUKQ0KCQluQ2hhcnNldCA9IEdldE5hdGl2ZUNoYXJzZXQoKTsNCg0KCXNGb250TmFtZSA9IEdldERlZmF1bHRGb250QnlDaGFyc2V0KG5DaGFyc2V0KTsNCg0KCWlmIChtX3BTeXN0ZW1IYW5kbGVyKQ0KCXsNCgkJaWYgKG1fcFN5c3RlbUhhbmRsZXItPkZpbmROYXRpdmVUcnVlVHlwZUZvbnQobkNoYXJzZXQsIHNGb250TmFtZSkpDQoJCQlyZXR1cm4gc0ZvbnROYW1lOw0KDQoJCXNGb250TmFtZSA9IG1fcFN5c3RlbUhhbmRsZXItPkdldE5hdGl2ZVRydWVUeXBlRm9udChuQ2hhcnNldCk7DQoJfQ0KDQoJcmV0dXJuIHNGb250TmFtZTsNCn0NCg0KQ1BERl9Gb250KiBDUFdMX0ZvbnRNYXA6OkFkZEZvbnRUb0RvY3VtZW50KENQREZfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsIEZYX0JZVEUgbkNoYXJzZXQpDQp7DQoJaWYgKElzU3RhbmRhcmRGb250KHNGb250TmFtZSkpDQoJCXJldHVybiBBZGRTdGFuZGFyZEZvbnQocERvYywgc0ZvbnROYW1lKTsNCgllbHNlDQoJCXJldHVybiBBZGRTeXN0ZW1Gb250KHBEb2MsIHNGb250TmFtZSwgbkNoYXJzZXQpOw0KfQ0KDQpDUERGX0ZvbnQqIENQV0xfRm9udE1hcDo6QWRkU3RhbmRhcmRGb250KENQREZfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUpDQp7DQoJaWYgKCFwRG9jKSByZXR1cm4gTlVMTDsNCg0KCUNQREZfRm9udCogcEZvbnQgPSBOVUxMOw0KDQoJaWYgKHNGb250TmFtZSA9PSAiWmFwZkRpbmdiYXRzIikNCgkJcEZvbnQgPSBwRG9jLT5BZGRTdGFuZGFyZEZvbnQoc0ZvbnROYW1lLCBOVUxMKTsNCgllbHNlDQoJew0KCQlDUERGX0ZvbnRFbmNvZGluZyBmZShQREZGT05UX0VOQ09ESU5HX1dJTkFOU0kpOw0KCQlwRm9udCA9IHBEb2MtPkFkZFN0YW5kYXJkRm9udChzRm9udE5hbWUsICZmZSk7DQoJfQ0KDQoJcmV0dXJuIHBGb250Ow0KfQ0KDQpDUERGX0ZvbnQqIENQV0xfRm9udE1hcDo6QWRkU3lzdGVtRm9udChDUERGX0RvY3VtZW50KiBwRG9jLCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLCBGWF9CWVRFIG5DaGFyc2V0KQ0Kew0KCWlmICghcERvYykgcmV0dXJuIE5VTEw7DQoNCglpZiAoc0ZvbnROYW1lLklzRW1wdHkoKSkgc0ZvbnROYW1lID0gR2V0TmF0aXZlRm9udChuQ2hhcnNldCk7DQoJaWYgKG5DaGFyc2V0ID09IERFRkFVTFRfQ0hBUlNFVCkgbkNoYXJzZXQgPSBHZXROYXRpdmVDaGFyc2V0KCk7DQoNCglpZiAobV9wU3lzdGVtSGFuZGxlcikNCgkJcmV0dXJuIG1fcFN5c3RlbUhhbmRsZXItPkFkZE5hdGl2ZVRydWVUeXBlRm9udFRvUERGKHBEb2MsIHNGb250TmFtZSwgbkNoYXJzZXQpOw0KCQ0KCXJldHVybiBOVUxMOw0KfQ0KDQpDRlhfQnl0ZVN0cmluZyBDUFdMX0ZvbnRNYXA6OkVuY29kZUZvbnRBbGlhcyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLCBGWF9JTlQzMiBuQ2hhcnNldCkNCnsNCglDRlhfQnl0ZVN0cmluZyBzUG9zdGZpeDsNCglzUG9zdGZpeC5Gb3JtYXQoIl8lMDJYIiwgbkNoYXJzZXQpOw0KCXJldHVybiBFbmNvZGVGb250QWxpYXMoc0ZvbnROYW1lKSArIHNQb3N0Zml4Ow0KfQ0KDQpDRlhfQnl0ZVN0cmluZyBDUFdMX0ZvbnRNYXA6OkVuY29kZUZvbnRBbGlhcyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lKQ0Kew0KCUNGWF9CeXRlU3RyaW5nIHNSZXQgPSBzRm9udE5hbWU7DQoJc1JldC5SZW1vdmUoJyAnKTsNCglyZXR1cm4gc1JldDsNCn0NCg0KRlhfSU5UMzIgQ1BXTF9Gb250TWFwOjpHZXRGb250TWFwQ291bnQoKSBjb25zdA0Kew0KCXJldHVybiBtX2FEYXRhLkdldFNpemUoKTsNCn0NCg0KY29uc3QgQ1BXTF9Gb250TWFwX0RhdGEqIENQV0xfRm9udE1hcDo6R2V0Rm9udE1hcERhdGEoRlhfSU5UMzIgbkluZGV4KSBjb25zdA0Kew0KCWlmIChuSW5kZXggPj0wICYmIG5JbmRleCA8IG1fYURhdGEuR2V0U2l6ZSgpKQ0KCXsNCgkJcmV0dXJuIG1fYURhdGEuR2V0QXQobkluZGV4KTsNCgl9DQoNCglyZXR1cm4gTlVMTDsNCn0NCg0KRlhfSU5UMzIgQ1BXTF9Gb250TWFwOjpHZXROYXRpdmVDaGFyc2V0KCkNCnsNCglGWF9CWVRFIG5DaGFyc2V0ID0gQU5TSV9DSEFSU0VUOw0KCUZYX0lOVDMyIGlDb2RlUGFnZSA9IEZYU1lTX0dldEFDUCgpOw0KCXN3aXRjaCAoaUNvZGVQYWdlKQ0KCXsNCgljYXNlIDkzMjovL0phcGFuDQoJCW5DaGFyc2V0ID0gU0hJRlRKSVNfQ0hBUlNFVDsNCgkJYnJlYWs7DQoJY2FzZSA5MzY6Ly9DaGluZXNlIChQUkMsIFNpbmdhcG9yZSkNCgkJbkNoYXJzZXQgPSBHQjIzMTJfQ0hBUlNFVDsNCgkJYnJlYWs7DQoJY2FzZSA5NTA6Ly9DaGluZXNlIChUYWl3YW47IEhvbmcgS29uZyBTQVIsIFBSQykNCgkJbkNoYXJzZXQgPSBHQjIzMTJfQ0hBUlNFVDsNCgkJYnJlYWs7DQoJY2FzZSAxMjUyOi8vV2luZG93cyAzLjEgTGF0aW4gMSAoVVMsIFdlc3Rlcm4gRXVyb3BlKQ0KCQluQ2hhcnNldCA9IEFOU0lfQ0hBUlNFVDsNCgkJYnJlYWs7DQoJY2FzZSA4NzQ6Ly9UaGFpDQoJCW5DaGFyc2V0ID0gVEhBSV9DSEFSU0VUOw0KCQlicmVhazsNCgljYXNlIDk0OTovL0tvcmVhbg0KCQluQ2hhcnNldCA9IEhBTkdVTF9DSEFSU0VUOw0KCQlicmVhazsNCgljYXNlIDEyMDA6Ly9Vbmljb2RlIChCTVAgb2YgSVNPIDEwNjQ2KQ0KCQluQ2hhcnNldCA9IEFOU0lfQ0hBUlNFVDsNCgkJYnJlYWs7DQoJY2FzZSAxMjUwOi8vV2luZG93cyAzLjEgRWFzdGVybiBFdXJvcGVhbg0KCQluQ2hhcnNldCA9IEVBU1RFVVJPUEVfQ0hBUlNFVDsNCgkJYnJlYWs7DQoJY2FzZSAxMjUxOi8vV2luZG93cyAzLjEgQ3lyaWxsaWMNCgkJbkNoYXJzZXQgPSBSVVNTSUFOX0NIQVJTRVQ7DQoJCWJyZWFrOw0KCWNhc2UgMTI1MzovL1dpbmRvd3MgMy4xIEdyZWVrDQoJCW5DaGFyc2V0ID0gR1JFRUtfQ0hBUlNFVDsNCgkJYnJlYWs7DQoJY2FzZSAxMjU0Oi8vV2luZG93cyAzLjEgVHVya2lzaA0KCQluQ2hhcnNldCA9IFRVUktJU0hfQ0hBUlNFVDsNCgkJYnJlYWs7DQoJY2FzZSAxMjU1Oi8vSGVicmV3DQoJCW5DaGFyc2V0ID0gSEVCUkVXX0NIQVJTRVQ7DQoJCWJyZWFrOw0KCWNhc2UgMTI1NjovL0FyYWJpYw0KCQluQ2hhcnNldCA9IEFSQUJJQ19DSEFSU0VUOw0KCQlicmVhazsNCgljYXNlIDEyNTc6Ly9CYWx0aWMNCgkJbkNoYXJzZXQgPSBCQUxUSUNfQ0hBUlNFVDsNCgkJYnJlYWs7DQoJY2FzZSAxMjU4Oi8vVmlldG5hbWVzZQ0KCQluQ2hhcnNldCA9IFZJRVROQU1FU0VfQ0hBUlNFVDsNCgkJYnJlYWs7DQoJY2FzZSAxMzYxOi8vS29yZWFuKEpvaGFiKQ0KCQluQ2hhcnNldCA9IEpPSEFCX0NIQVJTRVQ7DQoJCWJyZWFrOw0KCX0NCglyZXR1cm4gbkNoYXJzZXQ7DQp9DQoNCmNvbnN0IENQV0xfRm9udE1hcDo6Q2hhcnNldEZvbnRNYXAgQ1BXTF9Gb250TWFwOjpkZWZhdWx0VFRGTWFwW10gPSB7DQoJeyBBTlNJX0NIQVJTRVQsICJIZWx2ZXRpY2EiIH0sDQoJeyBHQjIzMTJfQ0hBUlNFVCwgIlNpbVN1biIgfSwNCgl7IENISU5FU0VCSUc1X0NIQVJTRVQsICJNaW5nTGlVIiB9LA0KCXsgU0hJRlRKSVNfQ0hBUlNFVCwgIk1TIEdvdGhpYyIgfSwNCgl7IEhBTkdVTF9DSEFSU0VULCAiQmF0YW5nIiB9LA0KCXsgUlVTU0lBTl9DSEFSU0VULCAiQXJpYWwiIH0sDQoJeyBFQVNURVVST1BFX0NIQVJTRVQsICJUYWhvbWEiIH0sDQoJeyBBUkFCSUNfQ0hBUlNFVCwgIkFyaWFsIiB9LA0KCXsgLTEsIE5VTEwgfQ0KfTsNCg0KQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpHZXREZWZhdWx0Rm9udEJ5Q2hhcnNldChGWF9JTlQzMiBuQ2hhcnNldCkNCnsNCglpbnQgaSA9IDA7DQoJd2hpbGUgKGRlZmF1bHRUVEZNYXBbaV0uY2hhcnNldCAhPSAtMSkgew0KCQlpZiAobkNoYXJzZXQgPT0gZGVmYXVsdFRURk1hcFtpXS5jaGFyc2V0KQ0KCQkJcmV0dXJuIGRlZmF1bHRUVEZNYXBbaV0uZm9udG5hbWU7DQogICAgICAgICsraTsNCgl9DQoJcmV0dXJuICIiOw0KfQ0KDQpGWF9JTlQzMiBDUFdMX0ZvbnRNYXA6OkNoYXJTZXRGcm9tVW5pY29kZShGWF9XT1JEIHdvcmQsIEZYX0lOVDMyIG5PbGRDaGFyc2V0KQ0Kew0KCWlmKG1fcFN5c3RlbUhhbmRsZXIgJiYgKC0xICE9IG1fcFN5c3RlbUhhbmRsZXItPkdldENoYXJTZXQoKSkpDQoJCXJldHVybiBtX3BTeXN0ZW1IYW5kbGVyLT5HZXRDaGFyU2V0KCk7DQoJLy90byBhdm9pZCBDSksgRm9udCB0byBzaG93IEFTQ0lJDQoJaWYgKHdvcmQgPCAweDdGKSByZXR1cm4gQU5TSV9DSEFSU0VUOw0KCS8vZm9sbG93IHRoZSBvbGQgY2hhcnNldA0KCWlmIChuT2xkQ2hhcnNldCAhPSBERUZBVUxUX0NIQVJTRVQpIHJldHVybiBuT2xkQ2hhcnNldDsNCg0KCS8vZmluZCBuZXcgY2hhcnNldA0KCWlmICgod29yZCA+PSAweDRFMDAgJiYgd29yZCA8PSAweDlGQTUpIHx8IA0KCQkod29yZCA+PSAweEU3QzcgJiYgd29yZCA8PSAweEU3RjMpIHx8DQoJCSh3b3JkID49IDB4MzAwMCAmJiB3b3JkIDw9IDB4MzAzRikgfHwgLy+jqSKhtiIgIqG3IiAioaMiICKhoiIgDQoJCSh3b3JkID49IDB4MjAwMCAmJiB3b3JkIDw9IDB4MjA2RikpDQoJew0KCQlyZXR1cm4gR0IyMzEyX0NIQVJTRVQ7DQoJfQ0KDQoJaWYgKCgod29yZCA+PSAweDMwNDApICYmICh3b3JkIDw9IDB4MzA5RikpIHx8DQoJCSgod29yZCA+PSAweDMwQTApICYmICh3b3JkIDw9IDB4MzBGRikpIHx8DQoJCSgod29yZCA+PSAweDMxRjApICYmICh3b3JkIDw9IDB4MzFGRikpIHx8DQoJCSgod29yZCA+PSAweEZGMDApICYmICh3b3JkIDw9IDB4RkZFRikpICkNCgl7DQoJCXJldHVybiBTSElGVEpJU19DSEFSU0VUOw0KCX0NCg0KCWlmICgoKHdvcmQgPj0gMHhBQzAwKSAmJiAod29yZCA8PSAweEQ3QUYpKSB8fA0KCQkoKHdvcmQgPj0gMHgxMTAwKSAmJiAod29yZCA8PSAweDExRkYpKSB8fA0KCQkoKHdvcmQgPj0gMHgzMTMwKSAmJiAod29yZCA8PSAweDMxOEYpKSkNCgl7DQoJCXJldHVybiBIQU5HVUxfQ0hBUlNFVDsNCgl9DQoNCglpZiAod29yZCA+PSAweDBFMDAgJiYgd29yZCA8PSAweDBFN0YpDQoJCXJldHVybiBUSEFJX0NIQVJTRVQ7DQoNCglpZiAoKHdvcmQgPj0gMHgwMzcwICYmIHdvcmQgPD0gMHgwM0ZGKSB8fA0KCQkod29yZCA+PSAweDFGMDAgJiYgd29yZCA8PSAweDFGRkYpKQ0KCQlyZXR1cm4gR1JFRUtfQ0hBUlNFVDsNCg0KCWlmICgod29yZCA+PSAweDA2MDAgJiYgd29yZCA8PSAweDA2RkYpIHx8DQoJCSh3b3JkID49IDB4RkI1MCAmJiB3b3JkIDw9IDB4RkVGQykpDQoJCXJldHVybiBBUkFCSUNfQ0hBUlNFVDsNCg0KCWlmICh3b3JkID49IDB4MDU5MCAmJiB3b3JkIDw9IDB4MDVGRikNCgkJcmV0dXJuIEhFQlJFV19DSEFSU0VUOw0KDQoJaWYgKHdvcmQgPj0gMHgwNDAwICYmIHdvcmQgPD0gMHgwNEZGKQ0KCQlyZXR1cm4gUlVTU0lBTl9DSEFSU0VUOw0KDQoJaWYgKHdvcmQgPj0gMHgwMTAwICYmIHdvcmQgPD0gMHgwMjRGKQ0KCQlyZXR1cm4gRUFTVEVVUk9QRV9DSEFSU0VUOw0KDQoJaWYgKHdvcmQgPj0gMHgxRTAwICYmIHdvcmQgPD0gMHgxRUZGKQ0KCQlyZXR1cm4gVklFVE5BTUVTRV9DSEFSU0VUOw0KDQoJcmV0dXJuIEFOU0lfQ0hBUlNFVDsNCn0NCg0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfRG9jRm9udE1hcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0KQ1BXTF9Eb2NGb250TWFwOjpDUFdMX0RvY0ZvbnRNYXAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyLCBDUERGX0RvY3VtZW50KiBwQXR0YWNoZWREb2MpIA0KCTogQ1BXTF9Gb250TWFwKHBTeXN0ZW1IYW5kbGVyKSwNCgltX3BBdHRhY2hlZERvYyhwQXR0YWNoZWREb2MpDQp7DQp9DQoNCkNQV0xfRG9jRm9udE1hcDo6fkNQV0xfRG9jRm9udE1hcCgpDQp7DQp9DQoNCkNQREZfRG9jdW1lbnQqIENQV0xfRG9jRm9udE1hcDo6R2V0RG9jdW1lbnQoKQ0Kew0KCXJldHVybiBtX3BBdHRhY2hlZERvYzsNCn0NCg==