Full Code of clovaai/dmfont for AI

master 488a8e823920 cached
42 files
472.7 KB
248.5k tokens
289 symbols
1 requests
Download .txt
Showing preview only (491K chars total). Download the full file or copy to clipboard to get everything.
Repository: clovaai/dmfont
Branch: master
Commit: 488a8e823920
Files: 42
Total size: 472.7 KB

Directory structure:
gitextract_5udlx8oy/

├── .gitignore
├── LICENSE
├── NOTICE
├── README.md
├── cfgs/
│   ├── kor.yaml
│   └── thai.yaml
├── criterions.py
├── datasets/
│   ├── __init__.py
│   ├── data_utils.py
│   ├── fcdata.py
│   ├── kor_dataset.py
│   ├── kor_decompose.py
│   ├── nonpaired_dataset.py
│   ├── samplers.py
│   ├── thai_dataset.py
│   └── thai_decompose.py
├── evaluator.py
├── inference.py
├── logger.py
├── meta/
│   ├── kor-unrefined.json
│   ├── kor_split.json
│   └── thai_split.json
├── models/
│   ├── __init__.py
│   ├── aux_classifier.py
│   ├── comp_encoder.py
│   ├── decoder.py
│   ├── discriminator.py
│   ├── ma_core.py
│   ├── memory.py
│   └── modules/
│       ├── __init__.py
│       ├── blocks.py
│       ├── modules.py
│       └── self_attention.py
├── requirements.txt
├── scripts/
│   └── prepare_dataset.py
├── ssim.py
├── train.py
├── trainer.py
└── utils/
    ├── __init__.py
    ├── utils.py
    ├── visualize.py
    └── writer.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
*.pkl
.ipynb_checkpoints
*.ipynb
*.png
backups/
runs/
__pycache__/
*.swp
checkpoints/
logs/
runs-back/
*.log
*.sh
tags*
test*

checkpoints
data
production
runs
fonts
test_cv/
test_us/


================================================
FILE: LICENSE
================================================
Copyright (c) 2020-present NAVER Corp.

 Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

 The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.


================================================
FILE: NOTICE
================================================
DMFont
Copyright (c) 2020-present NAVER Corp.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

--------------------------------------------------------------------------------------

This project contains subcomponents with separate copyright notices and license terms. 
Your use of the source code for these subcomponents is subject to the terms and conditions of the following licenses.

=====

NVlabs/FUNIT
https://github.com/NVlabs/FUNIT


creative commons
Attribution-NonCommercial-ShareAlike 4.0 International
Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible.

Using Creative Commons Public Licenses
Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses.

Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors.

Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public.

Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License
By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.

Section 1 – Definitions.
a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.

b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.

c. BY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License.

d. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.

e. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.

f. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.

g. License Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution, NonCommercial, and ShareAlike.

h. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.

i. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.

h. Licensor means the individual(s) or entity(ies) granting rights under this Public License.

i. NonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange.

j. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.

k. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.

l. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.

Section 2 – Scope.
a. License grant.

Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:
A. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and

B. produce, reproduce, and Share Adapted Material for NonCommercial purposes only.

Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.

Term. The term of this Public License is specified in Section 6(a).

Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.

Downstream recipients.

A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.

B. Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply.

C. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.

No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).
b. Other rights.

Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.

Patent and trademark rights are not licensed under this Public License.

To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes.

Section 3 – License Conditions.
Your exercise of the Licensed Rights is expressly made subject to the following conditions.

a. Attribution.

If You Share the Licensed Material (including in modified form), You must:
A. retain the following if it is supplied by the Licensor with the Licensed Material:

i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);

ii. a copyright notice;

iii. a notice that refers to this Public License;

iv. a notice that refers to the disclaimer of warranties;

v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable;

B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and

C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.

You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.

If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.

b. ShareAlike.

In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply.

The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-NC-SA Compatible License.

You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material.

You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply.

Section 4 – Sui Generis Database Rights.
Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:

a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only;

b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and

c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.

For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.

Section 5 – Disclaimer of Warranties and Limitation of Liability.
a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.

b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.

c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.

Section 6 – Term and Termination.
a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.

b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:

automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or

automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or

For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.

c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.

d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License.

Section 7 – Other Terms and Conditions.
a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.

b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.

Section 8 – Interpretation.
a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.

b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.

c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.

d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.

Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at [creativecommons.org/policies](http://creativecommons.org/policies), Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. 

Creative Commons may be contacted at [creativecommons.org](http://creativecommons.org/).

=====

jorge-pessoa/pytorch-msssim
https://github.com/jorge-pessoa/pytorch-msssim


Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

=====


================================================
FILE: README.md
================================================
## Few-shot Compositional Font Generation with Dual Memory (ECCV'20)

**NOTICE: We release the unified few-shot font generation repository ([clovaai/fewshot-font-generation](https://github.com/clovaai/fewshot-font-generation)). If you are interested in using our implementation, please visit the unified repository.**

<p align="center"><img width="80%" src="assets/teaser.jpg" /></p>

Official PyTorch implementation of DM-Font | [Paper](https://arxiv.org/abs/2005.10510) | [Video on ECCV 2020](https://youtu.be/VMrMJf21XEA)

Junbum Cha, Sanghyuk Chun, Gayoung Lee, Bado Lee, Seonghyeon Kim, Hwalsuk Lee.  
Clova AI Research, NAVER Corp.  
In ECCV 2020.

### Abstract

Generating a new font library is a very labor-intensive and time-consuming job for glyph-rich scripts. Despite the remarkable success of existing font generation methods, they have significant drawbacks; they require a large number of reference images to generate a new font set, or they fail to capture detailed styles with a few samples. In this paper, we focus on compositional scripts, a widely used letter system in the world, where each glyph can be decomposed by several components. By utilizing the compositionality of compositional scripts, we propose a novel font generation framework, named Dual Memory-augmented Font Generation Network (DM-Font), which enables us to generate a high-quality font library with only a few samples. We employ memory components and global-context awareness in the generator to take advantage of the compositionality. In the experiments on Korean-handwriting fonts and Thai-printing fonts, we observe that our method generates a significantly better quality of samples with faithful stylization compared to the state-of-the-art generation methods in quantitatively and qualitatively.

## Other related repositories

You can find more related projects on the few-shot font generation at the following links:

- [clovaai/dmfont](https://github.com/clovaai/dmfont) (ECCV'20) | [paper](https://arxiv.org/abs/2005.10510)
- [clovaai/lffont](https://github.com/clovaai/lffont) (AAAI'21) | [paper](https://arxiv.org/abs/2009.11042)
- [clovaai/mxfont](https://github.com/clovaai/mxfont) (ICCV'21) | [paper](https://arxiv.org/abs/2104.00887)
- [clovaai/fewshot-font-generation](https://github.com/clovaai/fewshot-font-generation) The unified few-shot font generation repository

## Installation

Install dependencies:

```
pip install -r requirements.txt
```

Note that using different version of required packages can effects the results, especially PyTorch. The implementations are tested on Python 3.6.

## Dataset preparation

### Data sources

Korean-handwriting and Thai-printing datasets were built from [UhBee fonts](http://uhbeefont.com/) and [Thai font collection](https://github.com/jeffmcneill/thai-font-collection), respectively.
To ensure the style diversity of the dataset, one font was selected for each font family in our experiments.

### Dumping dataset

The `scripts/prepare_dataset.py` script renders glyphs from the collected ttf fonts and dumps them into hdf5 files.
For the Thai-printing dataset, we rectify the rendering errors using [raqm](https://github.com/HOST-Oman/libraqm).
It should be installed before making dataset.

- Korean-handwriting

```
python -m scripts.prepare_dataset kor $FONTSDIR meta/kor_split.json $DUMPDIR
```

- Thai-printing

```
python -m scripts.prepare_dataset thai $FONTSDIR meta/thai_split.json $DUMPDIR
```

## How to run

### Pretrained models

For convenience, the minimal size checkpoints are provided by excluding training variables, e.g., momentums in optimizer, discriminator, and non-EMA generator.

- [Checkpoint trained on the Korean-handwriting dataset](https://github.com/clovaai/dmfont/releases/download/v1.0.0/korean-handwriting.pth)
- [Checkpoint trained on the Thai-printing dataset](https://github.com/clovaai/dmfont/releases/download/v1.0.0/thai-printing.pth)


### Training

- Korean-handwriting

```
python train.py $NAME cfgs/kor.yaml
```

- Thai-printing

```
python train.py $NAME cfgs/kor.yaml cfgs/thai.yaml
```

### Generation & Pixel-level evaluation

- Korean-handwriting

```
python evaluator.py $NAME $CHECKPOINT_PATH $OUT_DIR cfgs/kor.yaml --mode cv-save
```

- Thai-printing

```
python evaluator.py $NAME $CHECKPOINT_PATH $OUT_DIR cfgs/kor.yaml cfgs/thai.yaml --mode cv-save
```

- Korean-unrefined

```
python evaluator.py $NAME $CHECKPOINT_PATH $OUT_DIR cfgs/kor.yaml --mode user-study-save
```


## Citation

```
@inproceedings{cha2020dmfont,
    title={Few-shot Compositional Font Generation with Dual Memory},
    author={Cha, Junbum and Chun, Sanghyuk and Lee, Gayoung and Lee, Bado and Kim, Seonghyeon and Lee, Hwalsuk},
    year={2020},
    booktitle={European Conference on Computer Vision (ECCV)},
}
```

## License

This project is distributed under [MIT license](LICENSE), except modules.py which is adopted from https://github.com/NVlabs/FUNIT.

```
Copyright (c) 2020-present NAVER Corp.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
```


================================================
FILE: cfgs/kor.yaml
================================================
# train
data_dir: data/fonts-hdf5
data_meta: meta/kor_split.json
language: kor
batch_size: 12
max_iter: 200000
seed: 2
g_lr: 2e-4
d_lr: 8e-4
n_workers: 2
adam_betas: [0.0, 0.9]
init: kaiming

# dataset
# n_sample is the range of #targets per style chunk (T style chars)
dset_args:
  n_sample_min: 1
  n_sample_max: 4

# model
C: 32
g_args:
  comp_enc:
    norm: none
    activ: relu
    pad_type: zero
    sa:
      C_qk_ratio: 0.5
      n_heads: 2
      area: False
      ffn_mult: 2
  dec:
    norm: IN
    activ: relu
    pad_type: zero
d_args:
  w_norm: spectral
  use_rx: false
  activ: relu
  gap_activ: relu
  pad_type: zero
ac_args:
  norm: IN
  activ: relu
  pad_type: zero
  conv_dropout: 0.3
  clf_dropout: 0.2

# losses
pixel_w: 0.1
gan_w: 1.0
fm_w: 1.0
ac_w: 0.1

# etc
save: all-last
print_freq: 1000
val_freq: 10000
save_freq: 50000
tb_freq: 10


================================================
FILE: cfgs/thai.yaml
================================================
data_dir: data/thai-hdf5-fix2
data_meta: meta/thai_split.json
language: thai

g_lr: 5e-5
d_lr: 1e-4
max_iter: 250000
batch_size: 10


================================================
FILE: criterions.py
================================================
"""
DMFont
Copyright (c) 2020-present NAVER Corp.
MIT license
"""
import torch.nn.functional as F


def hinge_d_loss(real, fake):
    return F.relu(1. - real).mean() + F.relu(1. + fake).mean()


def hinge_g_loss(real, fake):
    return -fake.mean()


================================================
FILE: datasets/__init__.py
================================================
"""
DMFont
Copyright (c) 2020-present NAVER Corp.
MIT license
"""
from . import kor_dataset
from . import thai_dataset
from .fcdata import HDF5Data
from .data_utils import (
    cyclize, sample, uniform_sample,
    get_fonts_unionchars, get_union_chars, get_intersection_chars
)


def get_ma_dataset(*args, language=None, **kwargs):
    if language == 'kor':
        return kor_dataset.get_ma_dataset(*args, **kwargs)
    elif language == 'thai':
        return thai_dataset.get_ma_dataset(*args, **kwargs)
    else:
        raise ValueError(language)


def get_ma_val_dataset(*args, language=None, **kwargs):
    if language == 'kor':
        return kor_dataset.get_ma_val_dataset(*args, **kwargs)
    elif language == 'thai':
        return thai_dataset.get_ma_val_dataset(*args, **kwargs)
    else:
        raise ValueError(language)


================================================
FILE: datasets/data_utils.py
================================================
"""
DMFont
Copyright (c) 2020-present NAVER Corp.
MIT license
"""
import numpy as np


def cyclize(loader):
    """ Cyclize loader """
    while True:
        for x in loader:
            yield x


def rev_dict(l):
    """ Reverse dict or list """
    return {k: i for i, k in enumerate(l)}


def uniform_indices(end, n_sample, st=None):
    """ Sample from [0, end) with (almost) equidistant interval """
    if end <= 0:
        return np.empty(0, dtype=np.int)

    # NOTE with endpoint=False, np.linspace does not sample the `end` value
    indices = np.linspace(0, end, num=n_sample, dtype=np.int, endpoint=False)
    if st is None and end:
        st = (end-1 - indices[-1]) // 2
    return indices + st


def sample(population, n_sample, exception=None):
    """ sampling without replacement N elements from set with exception

    Params:
        population: [1d] list or set or np.ndarray
    Return: np.ndarray
    """
    if exception is not None:
        population = set(population) - set(exception)
    if not isinstance(population, np.ndarray):
        population = np.asarray(list(population))
    ids = np.random.choice(len(population), size=n_sample, replace=False)
    return population[ids]


def uniform_sample(population, n_sample, st=None):
    assert not isinstance(population, set), "population should have order"

    N = len(population)
    indices = uniform_indices(N, n_sample, st)

    if isinstance(population, np.ndarray):
        return population[indices]
    elif isinstance(population, list):
        return [population[idx] for idx in indices]
    elif isinstance(population, str):
        return ''.join([population[idx] for idx in indices])
    else:
        raise TypeError(type(population))


def get_fonts(avails):
    return list(avails.keys())


def get_union_chars(avails):
    return sorted(set.union(*map(set, avails.values())))


def get_fonts_unionchars(avails):
    return get_fonts(avails), get_union_chars(avails)


def get_intersection_chars(avails):
    return sorted(set.intersection(*map(set, avails.values())))


================================================
FILE: datasets/fcdata.py
================================================
"""
DMFont
Copyright (c) 2020-present NAVER Corp.
MIT license
"""
import h5py as h5
from torchvision import transforms

from . import thai_decompose as thai


class FCData:
    """ FontChar data
    Data module provides image access by font_name and char in get method
    """
    def get(self, font_name, char):
        raise NotImplementedError()


class HDF5Data(FCData):
    def __init__(self, hdf5_paths, transform=None, language='kor'):
        """
        cmap = {
            font_name: {
                char: idx,
                ...
            },
            ...
        }
        """
        self.paths = hdf5_paths
        self.transform = transform or transforms.ToTensor()
        self.language = language

        self.fn2path = {}
        self.cmap = {}
        self.n_items = 0

        # chars: union of all chars
        for path in hdf5_paths:
            with h5.File(path, 'r') as f:
                font_name = f['dataset'].attrs['font_name']
                self.fn2path[font_name] = path
                # [:] for batch read
                char2idx = self.make_char2idx(f['dataset']['chars'][:])
                self.cmap[font_name] = char2idx

                self.n_items += len(char2idx)

        # indexing
        self.fonts = list(self.cmap.keys())

    def make_char2idx(self, chars):
        """ Generate char2idx map
        Args:
            chars [N] or [N, 4]
                for kor: [N]
                for thai: [N, 4]
        """
        if self.language == 'kor':
            # chars: 1d array [N]
            char2idx = {
                chr(ch): i
                for i, ch in enumerate(chars)
            }
        elif self.language == 'thai':
            # chars: 2d array [N, 4]
            char2idx = {
                thai.compose(*ch): i
                for i, ch in enumerate(chars)
            }
        else:
            raise ValueError(self.language)

        return char2idx

    def is_avail(self, font_name, char):
        if font_name not in self.cmap:
            return False

        return char in self.cmap[font_name]

    def get(self, font_name, char, default=None, transform=None):
        """
        Args:
            default: if not available (font_name, char) is given, return default.
            transform: image transform. If not given, use self.transform.
        """
        if default is not None:
            if not self.is_avail(font_name, char):
                return default

        path = self.fn2path[font_name]

        with h5.File(path, 'r') as f:
            cidx = self.cmap[font_name][char]
            image = f['dataset']['images'][cidx]

        transform = transform or self.transform

        return transform(image)

    def get_from_reffont(self, char):
        """ get character image from reference font """
        if self.language == 'kor':
            font_name = "D2Coding-Ver1.3.2-20180524.ttf"
        elif self.language == 'thai':
            font_name = "NotoSansThai-Regular.ttf"

        return self.get(font_name, char)

    def get_avail_chars(self, font_name):
        return list(self.cmap[font_name].keys())


================================================
FILE: datasets/kor_dataset.py
================================================
"""
DMFont
Copyright (c) 2020-present NAVER Corp.
MIT license
"""
import random
from itertools import product

import numpy as np
import torch
from torch.utils.data import Dataset

from .kor_decompose import decompose, compose, COMPLETE_SET
from .samplers import StyleSampler
from .data_utils import rev_dict, sample, get_fonts, get_union_chars


class MAStyleFirstDataset(Dataset):
    """ Sampling style chars first and then generating target chars
        by combination of style components
    """
    def __init__(self, data, style_sampler, n_sample_min=1, n_sample_max=999,
                 f_mult=800, transform=None, content_font=None):
        """
        Args:
            style_sampler: style sampler with data source. avail fonts and avail chars are
                           determined by `style_sampler.avails`.
            n_sample_min: minimum # of target chars per 3 style chars.
            n_sample_max: maximum # of target chars per 3 style chars.
            f_mult: #fonts multiplier for full-batch
            transform: image transform. If not given, use data.transform as default.
        """
        self.data = data
        self.style_sampler = style_sampler
        self.avails = style_sampler.avails
        self.R = style_sampler.R
        self.n_sample_min = n_sample_min
        self.n_sample_max = n_sample_max
        self.f_mult = f_mult
        self.transform = transform
        self.content_font = content_font

        self.fonts = get_fonts(self.avails)
        self.chars = get_union_chars(self.avails)
        self.n_fonts = len(self.fonts)
        self.n_chars = len(self.chars)
        self.font2idx = rev_dict(self.fonts)
        self.char2idx = rev_dict(self.chars)
        self.n_avails = sum(len(chars) for chars in self.avails.values())

    def get_avail_chars(self, font_name, style_chars):
        avail_chars = set(self.avails[font_name])
        avail_chars = avail_chars - set(style_chars)

        return avail_chars

    def get_component_combinations(self, components, avail_chars, style_comp_ids=None):
        """ Generate all component combinations within avail_chars
        Args:
            style_comp_ids: style component ids for excluding duplication (if needed)
        """
        trg_comp_ids = []
        for cho, jung, jong in product(*components):
            char = compose(cho, jung, jong)
            if char not in avail_chars:
                continue

            ids = np.asarray([cho, jung, jong])
            # exclude duplicated components:
            # exclude target chars which has duplicate source style char
            # e.g.) src ["성", "공", "해"] => trg ["송"]  (duplicated)
            if ((style_comp_ids == ids).sum(axis=1) >= 2).any():
                continue

            trg_comp_ids.append(ids)

        return trg_comp_ids

    def check_and_sample(self, trg_comp_ids):
        n_sample = len(trg_comp_ids)
        if n_sample > self.n_sample_max:
            trg_comp_ids = sample(trg_comp_ids, self.n_sample_max)
        elif n_sample < self.n_sample_min:
            return None

        return trg_comp_ids

    def __getitem__(self, index):
        font_idx = index % self.n_fonts
        font_name = self.fonts[font_idx]
        while True:
            ####################################################
            # 1. sample styles
            ####################################################
            style_imgs, style_chars = self.style_sampler.get(font_name, ret_values=True)
            style_comp_ids = [decompose(char) for char in style_chars]
            chos, jungs, jongs = list(map(set, zip(*style_comp_ids)))

            # fullcomb
            if not (len(chos) == len(jungs) == len(jongs) == self.R):
                continue

            style_comp_ids = np.asarray(style_comp_ids)

            ####################################################
            # 2. sample targets from style components
            ####################################################
            avail_chars = self.get_avail_chars(font_name, style_chars)
            trg_comp_ids = self.get_component_combinations(
                (chos, jungs, jongs), avail_chars, style_comp_ids
            )
            trg_comp_ids = np.asarray(trg_comp_ids)
            trg_comp_ids = self.check_and_sample(trg_comp_ids)
            if trg_comp_ids is None:
                continue

            ####################################################
            # 3. setup chars, font_ids, char_ids and images
            ####################################################
            trg_chars = [compose(*comp_id) for comp_id in trg_comp_ids]
            trg_imgs = torch.cat([
                self.data.get(font_name, char, transform=self.transform)
                for char in trg_chars
            ])

            style_char_ids = [self.char2idx[ch] for ch in style_chars]
            trg_char_ids = [self.char2idx[ch] for ch in trg_chars]

            n_styles = len(style_chars)
            n_trgs = len(trg_chars)

            font_idx = torch.as_tensor(font_idx)
            ret = (
                font_idx.repeat(n_styles),
                torch.as_tensor(style_char_ids),
                torch.as_tensor(style_comp_ids),
                style_imgs,
                font_idx.repeat(n_trgs),
                torch.as_tensor(trg_char_ids),
                torch.as_tensor(trg_comp_ids),
                trg_imgs
            )
            if self.content_font:
                content_imgs = torch.cat([
                    self.data.get(self.content_font, char, transform=self.transform)
                    for char in trg_chars
                ])
                ret += (content_imgs,)
            return ret

    def __len__(self):
        return self.n_fonts * self.f_mult

    @staticmethod
    def collate_fn(batch):
        (style_ids, style_char_ids, style_comp_ids, style_imgs,
         trg_ids, trg_char_ids, trg_comp_ids, trg_imgs, *left) = zip(*batch)

        ret = (
            torch.cat(style_ids),
            torch.cat(style_char_ids),
            torch.cat(style_comp_ids),
            torch.cat(style_imgs).unsqueeze_(1),
            torch.cat(trg_ids),
            torch.cat(trg_char_ids),
            torch.cat(trg_comp_ids),
            torch.cat(trg_imgs).unsqueeze_(1)
        )

        if left:
            assert len(left) == 1
            content_imgs = left[0]
            ret += (
                torch.cat(content_imgs).unsqueeze_(1),
            )

        return ret


class MATargetFirstDataset(Dataset):
    """
    MAStyleFirstDatset samples source style characters first and then determines target characters.
    In contrast, MATargetFirstDataset samples target characters first and then
    determines source style characters.
    """
    def __init__(self, target_fc, style_avails, style_data, n_max_match=3, transform=None,
                 ret_targets=False, first_shuffle=False, content_font=None):
        """ TargetFirstDataset can use out-of-avails target chars,
            so long as its components could be represented in avail chars.

        Args:
            target_fc[font_name] = target_chars
            style_avails[font_name] = avail_style_chars
            style_data: style_data getter
            n_max_match: maximum-allowed matches between style char and target char.
                         n_max_match=3 indicates that style_char == target_char is possible.
            transform: image transform. If not given, use data.transform as default.
            ret_targets: return target images also
            first_shuffle: shuffle item list
        """
        self.target_fc = target_fc
        self.style_avails = style_avails
        self.style_avail_comps_list = {
            fname: [decompose(char) for char in char_list]
            for fname, char_list in style_avails.items()
        }
        self.n_max_match = n_max_match
        self.transform = transform
        self.ret_targets = ret_targets
        self.content_font = content_font

        self.style_data = style_data
        self.fcs = [
            (font_name, char)
            for font_name, char_list in target_fc.items()
            for char in char_list
        ]
        if first_shuffle:
            np.random.shuffle(self.fcs)
        self.fonts = get_fonts(self.target_fc)
        self.chars = get_union_chars(self.target_fc)
        self.font2idx = {font_name: i for i, font_name in enumerate(self.target_fc.keys())}

    def sample_style_char(self, font_name, trg_char):
        """ sample style char from target char within avail style chars """
        def is_allowed_matches(arr1, arr2):
            """ check # of matched ids
            return count(arr1 == arr2) <= self.n_max_match
            """
            if self.n_max_match >= 3:
                return True

            n_matched = sum(v1 == v2 for v1, v2 in zip(arr1, arr2))

            return n_matched <= self.n_max_match

        trg_comp_ids = decompose(trg_char)
        style_chars = []
        style_comps_list = []
        for i, _ in enumerate(trg_comp_ids):
            avail_comps_list = list(
                filter(
                    lambda comp_ids: comp_ids[i] == trg_comp_ids[i] \
                            and is_allowed_matches(comp_ids, trg_comp_ids),
                    self.style_avail_comps_list[font_name]
                )
            )
            style_comp_ids = random.choice(avail_comps_list)
            style_char = compose(*style_comp_ids)

            style_chars.append(style_char)
            style_comps_list.append(style_comp_ids)

        return style_chars, style_comps_list

    def __getitem__(self, index):
        font_name, trg_char = self.fcs[index]
        font_idx = self.font2idx[font_name]

        style_chars, style_comp_ids = self.sample_style_char(font_name, trg_char)
        style_imgs = torch.cat([
            self.style_data.get(font_name, char, transform=self.transform)
            for char in style_chars
        ])

        trg_comp_ids = [decompose(trg_char)]

        n_styles = len(style_chars)
        font_idx = torch.as_tensor(font_idx)

        style_ids = font_idx.repeat(n_styles)
        trg_ids = font_idx.repeat(1)

        content_img = self.style_data.get(self.content_font, trg_char, transform=self.transform)

        ret = (
            style_ids,
            torch.as_tensor(style_comp_ids),
            style_imgs,
            trg_ids,
            torch.as_tensor(trg_comp_ids),
            content_img
        )

        if self.ret_targets:
            trg_img = self.style_data.get(font_name, trg_char, transform=self.transform)
            ret += (trg_img, )

        return ret

    def __len__(self):
        return len(self.fcs)

    @staticmethod
    def collate_fn(batch):
        style_ids, style_comp_ids, style_imgs, trg_ids, trg_comp_ids, content_imgs, *left = \
            list(zip(*batch))

        ret = (
            torch.cat(style_ids),
            torch.cat(style_comp_ids),
            torch.cat(style_imgs).unsqueeze_(1),
            torch.cat(trg_ids),
            torch.cat(trg_comp_ids),
            torch.cat(content_imgs).unsqueeze_(1)
        )

        if left:
            assert len(left) == 1
            trg_imgs = left[0]
            ret += (torch.cat(trg_imgs).unsqueeze_(1), )

        return ret


def filter_complete_chars(chars):
    return sorted(set(chars) & COMPLETE_SET)


def get_ma_dataset(hdf5_data, avail_fonts, avail_chars=None, transform=None, **kwargs):
    if avail_chars:
        avail_chars = set(avail_chars)
    R_style = 3

    avails = {}
    for fname in avail_fonts:
        chars = hdf5_data.get_avail_chars(fname)
        if avail_chars:
            chars = set(chars) & avail_chars
        avails[fname] = filter_complete_chars(chars)

    style_sampler = StyleSampler(R_style, avails, hdf5_data)
    dset = MAStyleFirstDataset(hdf5_data, style_sampler, transform=transform, **kwargs)

    return dset, MAStyleFirstDataset.collate_fn


def get_ma_val_dataset(hdf5_data, fonts, chars, style_avails, n_max_match, transform, **kwargs):
    target_fc = {font_name: chars for font_name in fonts}
    dset = MATargetFirstDataset(
        target_fc, style_avails, hdf5_data, n_max_match, transform=transform, **kwargs
    )

    return dset, MATargetFirstDataset.collate_fn


================================================
FILE: datasets/kor_decompose.py
================================================
"""
DMFont
Copyright (c) 2020-present NAVER Corp.
MIT license
"""
COMPONENT_RANGE = (int('3131', 16), int('3163', 16))  # kr 자음/모음
COMPLETE_RANGE = (int('ac00', 16), int('d7a3', 16))   # kr all complete chars
COMPLETE_SET = frozenset(chr(code) for code in range(COMPLETE_RANGE[0], COMPLETE_RANGE[1]+1))
COMPLETE_LIST = sorted(COMPLETE_SET)

CHO_LIST = ['ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ',
            'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ']
JUNG_LIST = ['ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅓ', 'ㅔ', 'ㅕ', 'ㅖ', 'ㅗ', 'ㅘ', 'ㅙ', 'ㅚ',
             'ㅛ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅠ', 'ㅡ', 'ㅢ', 'ㅣ']
JONG_LIST = [' ', 'ㄱ', 'ㄲ', 'ㄳ', 'ㄴ', 'ㄵ', 'ㄶ', 'ㄷ', 'ㄹ', 'ㄺ', 'ㄻ', 'ㄼ',
             'ㄽ', 'ㄾ', 'ㄿ', 'ㅀ', 'ㅁ', 'ㅂ', 'ㅄ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅊ',
             'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ']

N_CHO, N_JUNG, N_JONG = len(CHO_LIST), len(JUNG_LIST), len(JONG_LIST)
N_COMPONENTS = N_CHO + N_JUNG + N_JONG


def compose(cho, jung, jong):
    """Compose ids to char"""
    char_id = cho * N_JONG * N_JUNG + jung * N_JONG + jong + COMPLETE_RANGE[0]
    return chr(char_id)


def decompose(char):
    """Decompose char to ids"""
    char_code = ord(char)
    if COMPLETE_RANGE[0] <= char_code <= COMPLETE_RANGE[1]:
        char_code -= COMPLETE_RANGE[0]
        jong = char_code % N_JONG
        jung = (char_code // N_JONG) % N_JUNG
        cho = char_code // (N_JONG * N_JUNG)
        char_id = (cho, jung, jong)
    elif COMPONENT_RANGE[0] <= char_code <= COMPONENT_RANGE[1]:
        char_code -= COMPONENT_RANGE[0]
        raise ValueError('Component only ({})'.format(char))
    else:
        raise ValueError('{} is Non kor'.format(char))

    return char_id


================================================
FILE: datasets/nonpaired_dataset.py
================================================
"""
DMFont
Copyright (c) 2020-present NAVER Corp.
MIT license
"""
import torch
from torch.utils.data import Dataset

from . import kor_decompose as kor
from . import thai_decompose as thai


class EncodeDataset(Dataset):
    def __init__(self, font_name, chars, data, language, style_id=0, transform=None):
        self.fname = font_name
        self.data = data
        self.chars = chars
        self.style_id = style_id
        self.transform = transform
        self.language = language

        if language == 'kor':
            self.decompose = kor.decompose
        elif language == 'thai':
            self.decompose = thai.decompose_ids
        else:
            raise ValueError(language)

    def __getitem__(self, index):
        style_char = self.chars[index]
        style_comp_ids = self.decompose(style_char)
        style_img = self.data.get(self.fname, style_char, transform=self.transform)

        return (
            self.style_id,
            torch.as_tensor(style_comp_ids),
            style_img
        )

    def __len__(self):
        return len(self.chars)


class DecodeDataset(Dataset):
    def __init__(self, chars, language, style_id=0):
        """
        Args:
            chars: target characters
            language
            style_id: Use different style id for different reference style set
        """
        self.chars = chars
        self.language = language
        self.style_id = style_id

        if language == 'kor':
            self.decompose = kor.decompose
        elif language == 'thai':
            raise NotImplementedError()
        else:
            raise ValueError(language)

    def __getitem__(self, index):
        char = self.chars[index]
        trg_comp_ids = self.decompose(char)

        return (
            self.style_id,
            torch.as_tensor(trg_comp_ids)
        )

    def __len__(self):
        return len(self.chars)


================================================
FILE: datasets/samplers.py
================================================
"""
DMFont
Copyright (c) 2020-present NAVER Corp.
MIT license
"""
import torch
from .data_utils import sample, uniform_indices


class Sampler:
    def __init__(self, R, avails, data):
        self.R = R
        self.avails = avails
        self.data = data

    def get_item(self, key, value):
        raise NotImplementedError()

    def get(self, key, ex_values=None, ret_values=False):
        """ Random sampling """
        values = self.avails[key]
        values = sample(values, self.R, ex_values)
        images = torch.cat([self.get_item(key, value) for value in values])

        if ret_values:
            return images, values

        return images

    def get_uniform(self, key, indices=None, st=None):
        values = self.avails[key]
        if indices is None:
            indices = uniform_indices(len(values), self.R, st)

        images, vals = [], []
        for idx in indices:
            value = values[idx]
            img = self.get_item(key, value)
            vals.append(value)
            images.append(img)

        return torch.cat(images), vals


class StyleSampler(Sampler):
    """ Return various content (char) but single style (font): which represent style """
    def get_item(self, font_name, char):
        return self.data.get(font_name, char)


class ContentSampler(Sampler):
    """ Return various style (font) but single content (char): which represent content """
    def get_item(self, char, font_name):
        return self.data.get(font_name, char)


================================================
FILE: datasets/thai_dataset.py
================================================
"""
DMFont
Copyright (c) 2020-present NAVER Corp.
MIT license
"""
import random
import numpy as np
import torch
from torch.utils.data import Dataset

from . import thai_decompose as thai
from .data_utils import rev_dict, get_fonts, get_union_chars


def product4_no_dup(consonants, uppers, highests, lowers):
    for i, co in enumerate(consonants):
        for j, up in enumerate(uppers):
            if i == j:
                continue
            for k, hi in enumerate(highests):
                if k in (i, j):
                    continue
                for l, lo in enumerate(lowers):
                    if l in (i, j, k):
                        continue
                    yield (co, up, hi, lo)


class MAStyleFirstDataset(Dataset):
    def __init__(self, data, fonts, chars, n_sample_min, n_sample_max,
                 f_mult=800, transform=None, content_font=None):
        self.data = data
        self.n_sample_min = n_sample_min
        self.n_sample_max = n_sample_max
        self.f_mult = f_mult
        self.transform = transform
        self.content_font = content_font

        self.fonts = fonts
        self.chars = chars
        self.n_fonts = len(fonts)
        self.n_chars = len(self.chars)
        self.font2idx = rev_dict(self.fonts)
        self.char2idx = rev_dict(self.chars)

        self.n_avails = self.n_fonts * self.n_chars
        # for compatibility
        self.avails = {
            fname: chars
            for fname in self.fonts
        }

    def sample_style_chars(self, n_styles):
        # Sampling performance can be improved but which is not the bottleneck, at least now.
        while True:
            # sample without replacement => fullcomb
            consonants = np.random.choice(thai.CONSONANTS, n_styles, replace=False)
            uppers = np.random.choice(thai.UPPERS, n_styles, replace=False)
            highests = np.random.choice(thai.HIGHESTS, n_styles, replace=False)
            lowers = np.random.choice(thai.LOWERS, n_styles, replace=False)

            style_chars = []
            style_ords = []
            for c, u, h, l in zip(consonants, uppers, highests, lowers):
                char = thai.compose(c, u, h, l)
                if char not in self.chars:
                    break

                style_chars.append(char)
                style_ords.append((c, u, h, l))
            else:
                # for-loop is not broken -> all chars available
                break

        components = (consonants, uppers, highests, lowers)
        return style_chars, style_ords, components

    def sample_trg_chars(self, components, style_chars):
        combinations = list(product4_no_dup(*components))
        np.random.shuffle(combinations)
        trg_chars = []
        trg_ords = []
        for c, u, h, l in combinations:
            char = thai.compose(c, u, h, l)
            # exclude style chars from target chars
            if char in style_chars or char not in self.chars:
                continue

            trg_chars.append(char)
            trg_ords.append((c, u, h, l))

            if len(trg_chars) >= self.n_sample_max:
                break

        return trg_chars, trg_ords

    def __getitem__(self, index):
        font_idx = index % self.n_fonts
        font_name = self.fonts[font_idx]

        n_styles = 4
        while True:
            # 1. sample style components
            style_chars, style_ords, components = self.sample_style_chars(n_styles)

            # 2. sample targets from style components
            trg_chars, trg_ords = self.sample_trg_chars(components, style_chars)
            if len(trg_chars) >= self.n_sample_min:
                break

        # 3. setup rest
        style_char_ids = [self.char2idx[ch] for ch in style_chars]
        style_comp_ids = thai.ord2idx_2d(style_ords)
        style_imgs = torch.cat([self.data.get(font_name, char) for char in style_chars])
        n_trgs = len(trg_chars)
        trg_char_ids = [self.char2idx[ch] for ch in trg_chars]
        trg_comp_ids = thai.ord2idx_2d(trg_ords)
        trg_imgs = torch.cat([self.data.get(font_name, char) for char in trg_chars])

        font_idx = torch.as_tensor(font_idx)
        ret = (
            font_idx.repeat(n_styles),
            torch.as_tensor(style_char_ids),
            torch.as_tensor(style_comp_ids),
            style_imgs,
            font_idx.repeat(n_trgs),
            torch.as_tensor(trg_char_ids),
            torch.as_tensor(trg_comp_ids),
            trg_imgs
        )

        if self.content_font:
            content_imgs = torch.cat([
                self.data.get(self.content_font, char, transform=self.transform)
                for char in trg_chars
            ])
            ret += (content_imgs,)

        return ret

    def __len__(self):
        return self.n_fonts * self.f_mult

    @staticmethod
    def collate_fn(batch):
        (style_ids, style_char_ids, style_comp_ids, style_imgs,
         trg_ids, trg_char_ids, trg_comp_ids, trg_imgs, *left) = zip(*batch)

        ret = (
            torch.cat(style_ids),
            torch.cat(style_char_ids),
            torch.cat(style_comp_ids),
            torch.cat(style_imgs).unsqueeze_(1),
            torch.cat(trg_ids),
            torch.cat(trg_char_ids),
            torch.cat(trg_comp_ids),
            torch.cat(trg_imgs).unsqueeze_(1)
        )

        if left:
            assert len(left) == 1
            content_imgs = left[0]
            ret += (
                torch.cat(content_imgs).unsqueeze_(1),
            )

        return ret


class MATargetFirstDataset(Dataset):
    def __init__(self, target_fc, style_avails, style_data, n_max_match=4, transform=None,
                 ret_targets=False, first_shuffle=False, content_font=None):
        """ TargetFirstDataset can use out-of-avails target chars,
            so long as its components could be represented in avail chars.

        Args:
            target_fc[font_name] = target_chars
            style_avails[font_name] = avail_style_chars
            style_data: style_data getter
            n_max_match: maximum-allowed matches between style char and target char.
                         n_max_match=4 indicates that style_char == target_char is possible.
            transform: image transform. If not given, use data.transform as default.
            ret_targets: return target images also
            first_shuffle: shuffle item list
        """
        self.target_fc = target_fc
        self.style_avails = style_avails
        self.style_avail_comps_list = {
            fname: [thai.decompose_ords(char) for char in char_list]
            for fname, char_list in style_avails.items()
        }
        self.n_max_match = n_max_match
        self.transform = transform
        self.ret_targets = ret_targets
        self.content_font = content_font

        self.style_data = style_data
        self.fcs = [
            (font_name, char)
            for font_name, char_list in target_fc.items()
            for char in char_list
        ]
        if first_shuffle:
            np.random.shuffle(self.fcs)
        self.fonts = get_fonts(self.target_fc)
        self.chars = get_union_chars(self.target_fc)
        self.font2idx = rev_dict(self.fonts)

    def sample_style_char(self, font_name, trg_char):
        """ sample style char from target char within avail style chars """
        def is_allowed_matches(arr1, arr2):
            """ check # of matched ids
            return count(arr1 == arr2) <= self.n_max_match
            """
            if self.n_max_match >= 4:
                return True

            n_matched = sum(v1 == v2 for v1, v2 in zip(arr1, arr2))

            return n_matched <= self.n_max_match

        trg_comp_ords = thai.decompose_ords(trg_char)
        style_chars = []
        style_comps_list = []
        for i, _ in enumerate(trg_comp_ords):
            avail_comps_list = list(
                filter(
                    lambda comp_ords: comp_ords[i] == trg_comp_ords[i] \
                            and is_allowed_matches(comp_ords, trg_comp_ords),
                    self.style_avail_comps_list[font_name]
                )
            )
            style_comp_ords = random.choice(avail_comps_list)
            style_char = thai.compose(*style_comp_ords)

            style_chars.append(style_char)
            style_comps_list.append(style_comp_ords)

        return style_chars, thai.ord2idx_2d(style_comps_list)

    def __getitem__(self, index):
        font_name, trg_char = self.fcs[index]
        font_idx = self.font2idx[font_name]

        style_chars, style_comp_ids = self.sample_style_char(font_name, trg_char)
        style_imgs = torch.cat([
            self.style_data.get(font_name, char, transform=self.transform)
            for char in style_chars
        ])

        trg_comp_ords = [thai.decompose_ords(trg_char)]
        trg_comp_ids = thai.ord2idx_2d(trg_comp_ords)

        n_styles = len(style_chars)
        font_idx = torch.as_tensor(font_idx)

        style_ids = font_idx.repeat(n_styles)
        trg_ids = font_idx.repeat(1)

        content_img = self.style_data.get(self.content_font, trg_char, transform=self.transform)

        ret = (
            style_ids,
            torch.as_tensor(style_comp_ids),
            style_imgs,
            trg_ids,
            torch.as_tensor(trg_comp_ids),
            content_img
        )

        if self.ret_targets:
            trg_img = self.style_data.get(font_name, trg_char, transform=self.transform)
            ret += (trg_img, )

        return ret

    def __len__(self):
        return len(self.fcs)

    @staticmethod
    def collate_fn(batch):
        style_ids, style_comp_ids, style_imgs, trg_ids, trg_comp_ids, content_imgs, *left = \
            list(zip(*batch))

        ret = (
            torch.cat(style_ids),
            torch.cat(style_comp_ids),
            torch.cat(style_imgs).unsqueeze_(1),
            torch.cat(trg_ids),
            torch.cat(trg_comp_ids),
            torch.cat(content_imgs).unsqueeze_(1)
        )

        if left:
            assert len(left) == 1
            trg_imgs = left[0]
            ret += torch.cat(trg_imgs).unsqueeze_(1),

        return ret


def get_ma_dataset(hdf5_data, avail_fonts, avail_chars=None, transform=None, **kwargs):
    if not avail_chars:
        avail_chars = list(thai.complete_chars())
    dset = MAStyleFirstDataset(hdf5_data, avail_fonts, avail_chars, transform=transform, **kwargs)

    return dset, MAStyleFirstDataset.collate_fn


def get_ma_val_dataset(hdf5_data, fonts, chars, style_avails, n_max_match, transform, **kwargs):
    target_fc = {font_name: chars for font_name in fonts}
    dset = MATargetFirstDataset(
        target_fc, style_avails, hdf5_data, n_max_match, transform=transform, **kwargs
    )

    return dset, MATargetFirstDataset.collate_fn


================================================
FILE: datasets/thai_decompose.py
================================================
"""
DMFont
Copyright (c) 2020-present NAVER Corp.
MIT license
"""
from .data_utils import rev_dict

CONSONANTS = [3585, 3586, 3587, 3588, 3589, 3590, 3591, 3592, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3601, 3602, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, 3611, 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, 3621, 3623, 3624, 3625, 3626, 3627, 3628, 3629, 3630]
UPPERS = [3633, 3635, 3636, 3637, 3638, 3639, 0]
HIGHESTS = [3655, 3656, 3657, 3658, 3659, 3660, 3661, 3662, 0]
LOWERS = [3640, 3641, 3642, 0]

N_CONSONANTS = len(CONSONANTS)
N_UPPERS = len(UPPERS)
N_HIGHESTS = len(HIGHESTS)
N_LOWERS = len(LOWERS)
N_COMPONENTS = N_CONSONANTS + N_UPPERS + N_HIGHESTS + N_LOWERS

def _ord2idx(ords):
    dic = {
        ord_num: i for i, ord_num in enumerate(ords)
    }
    return dic

CONSONANTS_ORD2IDX = _ord2idx(CONSONANTS)
UPPERS_ORD2IDX = _ord2idx(UPPERS)
HIGHESTS_ORD2IDX = _ord2idx(HIGHESTS)
LOWERS_ORD2IDX = _ord2idx(LOWERS)


def compose(consonant, upper, highest, lower):
    """ Compose ords to char """
    s = chr(consonant) \
        + (chr(upper) if upper else '') \
        + (chr(highest) if highest else '') \
        + (chr(lower) if lower else '')

    return s


def compose_ids(consonant, upper, highest, lower):
    """ Compose ids to char """
    consonant = CONSONANTS[consonant]
    upper = UPPERS[upper]
    highest = HIGHESTS[highest]
    lower = LOWERS[lower]

    return compose(consonant, upper, highest, lower)


def complete_chars():
    for consonant in CONSONANTS:
        for upper in UPPERS:
            for highest in HIGHESTS:
                for lower in LOWERS:
                    char = compose(consonant, upper, highest, lower)
                    yield char


ALLCHARS = list(complete_chars())
CHAR2IDX = rev_dict(ALLCHARS)


def ord2idx_2d(ords):
    """
    Args:
        ords: 2d [[consonant, upper, highest, lower], ...] array
    Return: 2d [[consonant_idx, upper_idx, highest_idx, lower_idx], ...] array
    """

    ret = []
    for consonant, upper, highest, lower in ords:
        consonant_idx = CONSONANTS_ORD2IDX[consonant]
        upper_idx = UPPERS_ORD2IDX[upper]
        highest_idx = HIGHESTS_ORD2IDX[highest]
        lower_idx = LOWERS_ORD2IDX[lower]

        ret.append((consonant_idx, upper_idx, highest_idx, lower_idx))

    return ret


def decompose_ords(char):
    """ Decompose char into ords """
    if not char:
        return 0, 0, 0, 0

    consonant = ord(char[0])
    upper = highest = lower = 0
    for ch in char[1:]:
        ch = ord(ch)
        if ch in UPPERS:
            upper = ch
        elif ch in HIGHESTS:
            highest = ch
        elif ch in LOWERS:
            lower = ch
        else:
            raise ValueError(char)

    return consonant, upper, highest, lower


def decompose_ids(char):
    """ Decompose char into ids """
    index = CHAR2IDX[char]
    return decompose_index(index)


def decompose_index(index):
    """ Decompose char index to component indices
    Note: char index come from `complete_chars()`.
    """
    lower_idx = index % N_LOWERS
    index //= N_LOWERS

    highest_idx = index % N_HIGHESTS
    index //= N_HIGHESTS

    upper_idx = index % N_UPPERS
    index //= N_UPPERS

    consonant_idx = index

    return consonant_idx, upper_idx, highest_idx, lower_idx


================================================
FILE: evaluator.py
================================================
"""
DMFont
Copyright (c) 2020-present NAVER Corp.
MIT license
"""
from itertools import chain
from pathlib import Path
import json
import argparse
import random

import numpy as np
import torch
import torch.nn.functional as F
from torchvision import transforms
from tqdm import tqdm
from sconf import Config

import utils
from logger import Logger

from models import MACore
from datasets import uniform_sample
from datasets import kor_decompose as kor
from datasets import thai_decompose as thai
from inference import (
    infer, get_val_loader,
    infer_2stage, get_val_encode_loader, get_val_decode_loader
)
from ssim import SSIM, MSSSIM


def torch_eval(val_fn):
    @torch.no_grad()
    def decorated(self, gen, *args, **kwargs):
        gen.eval()
        ret = val_fn(self, gen, *args, **kwargs)
        gen.train()

        return ret

    return decorated


class Evaluator:
    """DMFont evaluator.
    The evaluator provides pixel-level evaluation and glyphs generation
    from the reference style samples.
    """
    def __init__(self, data, trn_avails, logger, writer, batch_size, transform,
                 content_font, language, meta, val_loaders, n_workers=2):
        self.data = data
        self.logger = logger
        self.writer = writer
        self.batch_size = batch_size
        self.transform = transform
        self.n_workers = n_workers
        self.unify_resize_method = True

        self.trn_avails = trn_avails
        self.val_loaders = val_loaders
        self.content_font = content_font
        self.language = language
        if self.language == 'kor':
            self.n_comp_types = 3
        elif self.language == 'thai':
            self.n_comp_types = 4
        else:
            raise ValueError()

        # setup cross-validation
        self.SSIM = SSIM().cuda()
        weights = [0.25, 0.3, 0.3, 0.15]
        self.MSSSIM = MSSSIM(weights=weights).cuda()

        n_batches = [len(loader) for loader in self.val_loaders.values()]
        self.n_cv_batches = min(n_batches)
        self.logger.info("# of cross-validation batches = {}".format(self.n_cv_batches))

        # the number of chars/fonts for CV visualization
        n_chars = 16
        n_fonts = 16
        seen_chars = uniform_sample(meta['train']['chars'], n_chars//2)
        unseen_chars = uniform_sample(meta['valid']['chars'], n_chars//2)
        unseen_fonts = uniform_sample(meta['valid']['fonts'], n_fonts)

        self.cv_comparable_fonts = unseen_fonts
        self.cv_comparable_chars = seen_chars + unseen_chars

        allchars = meta['train']['chars'] + meta['valid']['chars']
        self.cv_comparable_avails = {
            font: allchars
            for font in self.cv_comparable_fonts
        }

    def validation(self, gen, step, extra_tag=''):
        self.comparable_validset_validation(gen, step, True, 'comparable_val'+extra_tag)

        plot_dic = {}
        for tag, loader in self.val_loaders.items():
            tag = tag + extra_tag
            l1, ssim, msssim = self.cross_validation(
                gen, step, loader, tag, n_batches=self.n_cv_batches
            )
            plot_dic[f'val/{tag}/l1'] = l1
            plot_dic[f'val/{tag}/ssim'] = ssim
            plot_dic[f'val/{tag}/ms-ssim'] = msssim if not np.isnan(msssim) else 0.
        self.writer.add_scalars(plot_dic, step)

        return plot_dic

    @torch_eval
    def comparable_validset_validation(self, gen, step, compare_inputs=False, tag='comparable_val'):
        """Comparable validation on validation set from CV"""
        comparable_grid = self.comparable_validation(
            gen, self.cv_comparable_avails, self.cv_comparable_fonts, self.cv_comparable_chars,
            n_max_match=1, compare_inputs=compare_inputs
        )

        self.writer.add_image(tag, comparable_grid, global_step=step)

    @torch_eval
    def comparable_validation(self, gen, style_avails, target_fonts, target_chars, n_max_match=3,
                              compare_inputs=False):
        """Compare horizontally for target fonts and chars"""
        # infer
        loader = get_val_loader(
            self.data, target_fonts, target_chars, style_avails,
            B=self.batch_size, n_max_match=n_max_match, transform=self.transform,
            content_font=self.content_font, language=self.language, n_workers=self.n_workers
        )
        out = infer(gen, loader)  # [B, 1, 128, 128]

        # ref original chars
        refs = self.get_charimages(target_fonts, target_chars)

        compare_batches = [refs, out]
        if compare_inputs:
            compare_batches += self.get_inputimages(loader)

        nrow = len(target_chars)
        comparable_grid = utils.make_comparable_grid(*compare_batches, nrow=nrow)

        return comparable_grid

    @torch_eval
    def cross_validation(self, gen, step, loader, tag, n_batches, n_log=64, save_dir=None):
        """Validation using splitted cross-validation set
        Args:
            n_log: # of images to log
            save_dir: if given, images are saved to save_dir
        """
        if save_dir:
            save_dir = Path(save_dir)
            save_dir.mkdir(parents=True, exist_ok=True)

        outs = []
        trgs = []
        n_accum = 0

        losses = utils.AverageMeters("l1", "ssim", "msssim")
        for i, (style_ids, style_comp_ids, style_imgs,
                trg_ids, trg_comp_ids, content_imgs, trg_imgs) in enumerate(loader):
            if i == n_batches:
                break

            style_ids = style_ids.cuda()
            style_comp_ids = style_comp_ids.cuda()
            style_imgs = style_imgs.cuda()
            trg_ids = trg_ids.cuda()
            trg_comp_ids = trg_comp_ids.cuda()
            trg_imgs = trg_imgs.cuda()

            gen.encode_write(style_ids, style_comp_ids, style_imgs)
            out = gen.read_decode(trg_ids, trg_comp_ids)
            B = len(out)

            # log images
            if n_accum < n_log:
                trgs.append(trg_imgs)
                outs.append(out)
                n_accum += B

                if n_accum >= n_log:
                    # log results
                    outs = torch.cat(outs)[:n_log]
                    trgs = torch.cat(trgs)[:n_log]
                    self.merge_and_log_image(tag, outs, trgs, step)

            l1, ssim, msssim = self.get_pixel_losses(out, trg_imgs, self.unify_resize_method)
            losses.updates({
                "l1": l1.item(),
                "ssim": ssim.item(),
                "msssim": msssim.item()
            }, B)

            # save images
            if save_dir:
                font_ids = trg_ids.detach().cpu().numpy()
                images = out.detach().cpu()  # [B, 1, 128, 128]
                char_comp_ids = trg_comp_ids.detach().cpu().numpy()  # [B, n_comp_types]
                for font_id, image, comp_ids in zip(font_ids, images, char_comp_ids):
                    font_name = loader.dataset.fonts[font_id]  # name.ttf
                    font_name = Path(font_name).stem  # remove ext
                    (save_dir / font_name).mkdir(parents=True, exist_ok=True)
                    if self.language == 'kor':
                        char = kor.compose(*comp_ids)
                    elif self.language == 'thai':
                        char = thai.compose_ids(*comp_ids)

                    uni = "".join([f'{ord(each):04X}' for each in char])
                    path = save_dir / font_name / "{}_{}.png".format(font_name, uni)
                    utils.save_tensor_to_image(image, path)

        self.logger.info(
            "  [Valid] {tag:30s} | Step {step:7d}  L1 {L.l1.avg:7.4f}  SSIM {L.ssim.avg:7.4f}"
            "  MSSSIM {L.msssim.avg:7.4f}"
            .format(tag=tag, step=step, L=losses))

        return losses.l1.avg, losses.ssim.avg, losses.msssim.avg

    def get_pixel_losses(self, out, trg_imgs, unify):
        """
        Args:
            out: generated images
            trg_imgs: target GT images
            unify: if True is given, unify glyph size and resize method before evaluation.
                This option give us the fair evaluation setting, which is used in the paper.
        """
        def unify_resize_method(img):
            # Unify various glyph size and resize method for fair evaluation
            size = img.size(-1)
            if size == 128:
                transform = transforms.Compose([
                    transforms.ToPILImage(),
                    transforms.Resize([64, 64]),
                    transforms.ToTensor(),
                    transforms.Normalize((0.5,), (0.5,))
                ])
                img = torch.stack([transform(_img) for _img in img.cpu()]).cuda()

            img = F.interpolate(img, scale_factor=2.0, mode='bicubic', align_corners=True)
            return img

        if unify:
            out = unify_resize_method(out)
            trg_imgs = unify_resize_method(trg_imgs)

        l1 = F.l1_loss(out, trg_imgs)
        ssim = self.SSIM(out, trg_imgs)
        msssim = self.MSSSIM(out, trg_imgs)

        return l1, ssim, msssim

    @torch_eval
    def handwritten_validation_2stage(self, gen, step, fonts, style_chars, target_chars,
                                      comparable=False, save_dir=None, tag='hw_validation_2stage'):
        """2-stage handwritten validation
        Args:
            fonts: [font_name1, font_name2, ...]
            save_dir: if given, do not write image grid, instead save every image into save_dir
        """
        if save_dir is not None:
            save_dir = Path(save_dir)
            save_dir.mkdir(parents=True, exist_ok=True)

        outs = []
        for font_name in tqdm(fonts):
            encode_loader = get_val_encode_loader(
                self.data, font_name, style_chars, self.language, self.transform
            )
            decode_loader = get_val_decode_loader(target_chars, self.language)
            out = infer_2stage(gen, encode_loader, decode_loader)
            outs.append(out)

            if save_dir:
                for char, glyph in zip(target_chars, out):
                    uni = "".join([f'{ord(each):04X}' for each in char])
                    path = save_dir / font_name / "{}_{}.png".format(font_name, uni)
                    path.parent.mkdir(parents=True, exist_ok=True)
                    utils.save_tensor_to_image(glyph, path)

        if save_dir:  # do not write grid
            return

        out = torch.cat(outs)
        if comparable:
            # ref original chars
            refs = self.get_charimages(fonts, target_chars)

            nrow = len(target_chars)
            grid = utils.make_comparable_grid(refs, out, nrow=nrow)
        else:
            grid = utils.to_grid(out, 'torch', nrow=len(target_chars))

        tag = tag + target_chars[:4]
        self.writer.add_image(tag, grid, global_step=step)

    def get_inputimages(self, val_loader):
        # integrate style images
        inputs = []
        for style_ids, style_comp_ids, style_imgs, trg_ids, trg_comp_ids, content_imgs \
                in val_loader:
            inputs.append(style_imgs)

        inputs = torch.cat(inputs)
        shape = inputs.shape
        inputs = inputs.view(shape[0]//self.n_comp_types, self.n_comp_types, *shape[1:])
        batches = [inputs[:, i] for i in range(self.n_comp_types)]

        return batches

    def get_charimages(self, fonts, chars, empty_header=False, as_tensor=True):
        """ get char images from self.data
        Return:
            2d list of charimages or 5d tensor:
            [
                [charimage1, charimage2, ...] (font1),
                ...
            ]
            or
            Tensor [n_fonts, n_chars, 1, 128, 128]
        """
        empty_box = torch.ones(1, 128, 128)
        charimages = [
            [self.data.get(font_name, char, empty_box) for char in chars]
            for font_name in fonts
        ]

        if empty_header:
            header = [empty_box for _ in chars]
            charimages.insert(0, header)

        if as_tensor:
            charimages = torch.stack(list(chain.from_iterable(charimages)))

        return charimages

    def merge_and_log_image(self, name, out, target, step):
        """ Merge out and target into 2-column grid and log it """
        merge = utils.make_merged_grid([out, target], merge_dim=2)
        self.writer.add_image(name, merge, global_step=step)


def eval_ckpt():
    from train import (
        setup_language_dependent, setup_data, setup_cv_dset_loader,
        get_dset_loader
    )

    logger = Logger.get()

    parser = argparse.ArgumentParser('MaHFG-eval')
    parser.add_argument(
        "name", help="name is used for directory name of the user-study generation results"
    )
    parser.add_argument("resume")
    parser.add_argument("img_dir")
    parser.add_argument("config_paths", nargs="+")
    parser.add_argument("--show", action="store_true", default=False)
    parser.add_argument(
        "--mode", default="eval",
        help="eval (default) / cv-save / user-study / user-study-save. "
             "`eval` generates comparable grid and computes pixel-level CV scores. "
             "`cv-save` generates and saves all target characters in CV. "
             "`user-study` generates comparable grid for the ramdomly sampled target characters. "
             "`user-study-save` generates and saves all target characters in user-study."
    )
    parser.add_argument("--deterministic", default=False, action="store_true")
    parser.add_argument("--debug", default=False, action="store_true")
    args, left_argv = parser.parse_known_args()

    cfg = Config(*args.config_paths)
    cfg.argv_update(left_argv)

    torch.backends.cudnn.benchmark = True

    cfg['data_dir'] = Path(cfg['data_dir'])

    if args.show:
        exit()

    # seed
    np.random.seed(cfg['seed'])
    torch.manual_seed(cfg['seed'])
    random.seed(cfg['seed'])

    if args.deterministic:
        torch.backends.cudnn.benchmark = False
        torch.backends.cudnn.deterministic = True
        cfg['n_workers'] = 0
        logger.info("#" * 80)
        logger.info("# Deterministic option is activated !")
        logger.info("# Deterministic evaluator only ensure the deterministic cross-validation")
        logger.info("#" * 80)
    else:
        torch.backends.cudnn.benchmark = True

    if args.mode.startswith('mix'):
        assert cfg['g_args']['style_enc']['use'], \
                "Style mixing is only available with style encoder model"

    #####################################
    # Dataset
    ####################################
    # setup language dependent values
    content_font, n_comp_types, n_comps = setup_language_dependent(cfg)

    # setup transform
    transform = transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize([0.5], [0.5])
    ])

    # setup data
    hdf5_data, meta = setup_data(cfg, transform)

    # setup dataset
    trn_dset, loader = get_dset_loader(
        hdf5_data, meta['train']['fonts'], meta['train']['chars'], transform, True, cfg,
        content_font=content_font
    )

    val_loaders = setup_cv_dset_loader(
        hdf5_data, meta, transform, n_comp_types, content_font, cfg
    )

    #####################################
    # Model
    ####################################
    # setup generator only
    g_kwargs = cfg.get('g_args', {})
    gen = MACore(
        1, cfg['C'], 1, **g_kwargs, n_comps=n_comps, n_comp_types=n_comp_types,
        language=cfg['language']
    )
    gen.cuda()

    ckpt = torch.load(args.resume)
    logger.info("Use EMA generator as default")
    gen.load_state_dict(ckpt['generator_ema'])

    step = ckpt['epoch']
    loss = ckpt['loss']

    logger.info("Resumed checkpoint from {} (Step {}, Loss {:7.3f})".format(
        args.resume, step, loss))

    writer = utils.DiskWriter(args.img_dir, 0.6)

    evaluator = Evaluator(
        hdf5_data, trn_dset.avails, logger, writer, cfg['batch_size'],
        content_font=content_font, transform=transform, language=cfg['language'],
        val_loaders=val_loaders, meta=meta
    )
    evaluator.n_cv_batches = -1
    logger.info("Update n_cv_batches = -1 to evaluate about full data")
    if args.debug:
        evaluator.n_cv_batches = 10
        logger.info("!!! DEBUG MODE: n_cv_batches = 10 !!!")

    if args.mode == 'eval':
        logger.info("Start validation ...")
        dic = evaluator.validation(gen, step)
        logger.info("Validation is done. Result images are saved to {}".format(args.img_dir))
    elif args.mode.startswith('user-study'):
        meta = json.load(open('meta/kor-unrefined.json'))
        target_chars = meta['target_chars']
        style_chars = meta['style_chars']
        fonts = meta['fonts']

        if args.mode == 'user-study':
            sampled_target_chars = uniform_sample(target_chars, 20)
            logger.info("Start generation kor-unrefined ...")
            logger.info("Sampled chars = {}".format(sampled_target_chars))

            evaluator.handwritten_validation_2stage(
                gen, step, fonts, style_chars, sampled_target_chars,
                comparable=True, tag='userstudy-{}'.format(args.name)
            )
        elif args.mode == 'user-study-save':
            logger.info("Start generation & saving kor-unrefined ...")
            save_dir = Path(args.img_dir) / "{}-{}".format(args.name, step)
            evaluator.handwritten_validation_2stage(
                gen, step, fonts, style_chars, target_chars,
                comparable=True, save_dir=save_dir
            )
        logger.info("Validation is done. Result images are saved to {}".format(args.img_dir))
    elif args.mode == 'cv-save':
        save_dir = Path(args.img_dir) / "cv_images_{}".format(step)
        logger.info("Save CV results to {} ...".format(save_dir))
        utils.rm(save_dir)
        for tag, loader in val_loaders.items():
            l1, ssim, msssim = evaluator.cross_validation(
                gen, step, loader, tag, n_batches=evaluator.n_cv_batches, save_dir=(save_dir / tag)
            )
    else:
        raise ValueError(args.mode)


if __name__ == "__main__":
    eval_ckpt()


================================================
FILE: inference.py
================================================
"""
DMFont
Copyright (c) 2020-present NAVER Corp.
MIT license
"""
import torch
from torch.utils.data import DataLoader
from datasets import get_ma_val_dataset
from datasets.nonpaired_dataset import EncodeDataset, DecodeDataset


def infer(gen, loader):
    outs = []
    for style_ids, style_comp_ids, style_imgs, trg_ids, trg_comp_ids, content_imgs \
            in loader:
        style_ids = style_ids.cuda()
        style_comp_ids = style_comp_ids.cuda()
        style_imgs = style_imgs.cuda()
        trg_ids = trg_ids.cuda()
        trg_comp_ids = trg_comp_ids.cuda()

        gen.encode_write(style_ids, style_comp_ids, style_imgs)
        out = gen.read_decode(trg_ids, trg_comp_ids)

        outs.append(out.detach().cpu())

    return torch.cat(outs)  # [B, 1, 128, 128]; B = #fonts * #chars


def get_val_loader(data, fonts, chars, style_avails, transform, content_font, language,
                   B=32, n_max_match=3, n_workers=2):
    val_dset, collate_fn = get_ma_val_dataset(
        data, fonts, chars, style_avails, n_max_match, transform=transform,
        content_font=content_font, language=language
    )
    loader = DataLoader(val_dset, batch_size=B, shuffle=False,
                        num_workers=n_workers, collate_fn=collate_fn)

    return loader


def infer_2stage(gen, encode_loader, decode_loader, reset_memory=True):
    """ 2-stage infer; encode first, decode second """
    # stage 1. encode
    if reset_memory:
        gen.reset_dynamic_memory()

    for style_ids, style_comp_ids, style_imgs in encode_loader:
        style_ids = style_ids.cuda()
        style_comp_ids = style_comp_ids.cuda()
        style_imgs = style_imgs.cuda()

        gen.encode_write(style_ids, style_comp_ids, style_imgs, reset_dynamic_memory=False)

    # stage 2. decode
    outs = []
    for trg_ids, trg_comp_ids in decode_loader:
        trg_ids = trg_ids.cuda()
        trg_comp_ids = trg_comp_ids.cuda()

        out = gen.read_decode(trg_ids, trg_comp_ids)

        outs.append(out.detach().cpu())

    return torch.cat(outs)


def get_val_encode_loader(data, font_name, encode_chars, language, transform, B=32, num_workers=2,
                          style_id=0):
    encode_dset = EncodeDataset(
        font_name, encode_chars, data, language=language, transform=transform, style_id=style_id
    )
    loader = DataLoader(encode_dset, batch_size=B, shuffle=False, num_workers=num_workers)

    return loader


def get_val_decode_loader(chars, language, B=32, num_workers=2, style_id=0):
    decode_dset = DecodeDataset(chars, language=language, style_id=style_id)
    loader = DataLoader(decode_dset, batch_size=B, shuffle=False, num_workers=num_workers)

    return loader


================================================
FILE: logger.py
================================================
"""
DMFont
Copyright (c) 2020-present NAVER Corp.
MIT license
"""
import sys
import logging


log_lv = {
    'critical': logging.CRITICAL,
    'error': logging.ERROR,
    'warning': logging.WARNING,
    'info': logging.INFO,
    'debug': logging.DEBUG
}


class ColorFormatter(logging.Formatter):
    color_dic = {
        'DEBUG'   : 37,  # white
        'INFO'    : 36,  # cyan
        'WARNING' : 33,  # yellow
        'ERROR'   : 31,  # red
        'CRITICAL': 41,  # white on red bg
    }

    def format(self, record):
        color = self.color_dic.get(record.levelname, 37) # default white
        record.levelname = "\033[{}m{}\033[0m".format(color, record.levelname)
        return logging.Formatter.format(self, record)


class Logger(logging.Logger):
    NAME = 'SingletonLogger'

    @classmethod
    def get(cls, file_path=None, level='info', colorize=True):
        logging.setLoggerClass(cls)
        logger = logging.getLogger(cls.NAME)
        logging.setLoggerClass(logging.Logger) # restore
        logger.setLevel(log_lv[level])

        if logger.hasHandlers():
            # If logger already got all handlers (# handlers == 2), use the logger.
            # else, re-set handlers.
            if len(logger.handlers) == 2:
                return logger

            logger.handlers.clear()

        log_format = '%(levelname)s::%(asctime)s | %(message)s'
        date_format = '%m/%d %H:%M:%S'
        if colorize:
            formatter = ColorFormatter(log_format, date_format)
        else:
            formatter = logging.Formatter(log_format, date_format)

        # standard output handler
        # NOTE as default, StreamHandler use stderr stream instead of stdout stream.
        # Use StreamHandler(sys.stdout) for stdout stream.
        stream_handler = logging.StreamHandler(sys.stdout)
        stream_handler.setFormatter(formatter)
        logger.addHandler(stream_handler)

        if file_path:
            # file output handler
            file_handler = logging.FileHandler(file_path)
            file_handler.setFormatter(formatter)
            logger.addHandler(file_handler)

        logger.propagate = False

        return logger

    def nofmt(self, msg, *args, level='info', **kwargs):
        level = log_lv[level]
        formatters = self.remove_formats()
        super().log(level, msg, *args, **kwargs)
        self.set_formats(formatters)

    def remove_formats(self):
        """ Remove all formats from logger """
        formatters = []
        for handler in self.handlers:
            formatters.append(handler.formatter)
            handler.setFormatter(logging.Formatter("%(message)s"))

        return formatters

    def set_formats(self, formatters):
        """ Set formats to every handler of logger """
        for handler, formatter in zip(self.handlers, formatters):
            handler.setFormatter(formatter)

    def set_file_handler(self, file_path):
        file_handler = logging.FileHandler(file_path)
        formatter = self.handlers[0].formatter
        file_handler.setFormatter(formatter)
        self.addHandler(file_handler)


================================================
FILE: meta/kor-unrefined.json
================================================
{"target_chars": "\uac00\uace0\uacfe\uad18\uad53\uadf8\uae68\uaf86\uaf9c\ub044\ub04c\ub0d0\ub0f5\ub1cc\ub204\ub247\ub290\ub29c\ub338\ub3d2\ub46c\ub488\ub4b3\ub4dc\ub5a0\ub610\ub63e\ub6f0\ub728\ub73c\ub808\ub878\ub8c6\ub958\ub974\ub98c\uba70\ubafc\ubb6a\ubbc0\ubbdc\ubcd8\ubd2c\ubd67\ubd9c\ube0c\ube10\ube45\ubf40\ubf62\ubfb0\ubfd3\uc058\uc090\uc0ac\uc0d1\uc1a8\uc1ea\uc218\uc2a4\uc2b0\uc314\uc33d\uc42c\uc49c\uc4c7\uc4f0\uc500\uc57c\uc636\uc6cc\uc704\uc733\uc73c\uc7e4\uc815\uc870\uc96c\uc988\uc9bb\uca4c\uca81\ucad8\ucb0f\ucbd4\ucbf0\uccb4\uccd1\ucd40\ucd5c\ucdb2\uce20\uce24\ucf1c\ucf3d\ucfc4\ucfe7\ucffc\ud06c\ud074\ud184\ud1a0\ud1c6\ud22c\ud26f\ud2b8\ud319\ud408\ud44e\ud4b0\ud504\ud514\ud53c\ud558\ud585\ud68c\ud718\ud747\ud750\ud764", "style_chars": "\uac1d\uadfc\uae89\uaf48\uafbf\ub22a\ub361\ub4ec\ub5cd\ub71f\ub839\ub9a7\ubaa5\ubafb\ubcf6\ube65\uc060\uc25b\uc48e\uc5a9\uc750\uc8a2\uc9a0\ucb2a\ucd7b\ucf5a\ud2c4\ud2f9\ud4db\ud6f2", "fonts": ["Handwritten-10113", "Handwritten-10483", "Handwritten-10518", "Handwritten-10637", "Handwritten-10789", "Handwritten-10803", "Handwritten-11218", "Handwritten-11266", "Handwritten-11282", "Handwritten-11441", "Handwritten-11564", "Handwritten-11997", "Handwritten-13026", "Handwritten-15959", "Handwritten-16510", "Handwritten-16921", "Handwritten-17143", "Handwritten-19035", "Handwritten-19211", "Handwritten-19651", "Handwritten-20590", "Handwritten-22536", "Handwritten-23081", "Handwritten-2337", "Handwritten-24513", "Handwritten-2532", "Handwritten-2939", "Handwritten-3086", "Handwritten-3103", "Handwritten-321", "Handwritten-3246", "Handwritten-3336", "Handwritten-3487", "Handwritten-3491", "Handwritten-3675", "Handwritten-3678", "Handwritten-3787", "Handwritten-3839", "Handwritten-3861", "Handwritten-3874", "Handwritten-3889", "Handwritten-3926", "Handwritten-3941", "Handwritten-3996", "Handwritten-4124", "Handwritten-4125", "Handwritten-4342", "Handwritten-4419", "Handwritten-4487", "Handwritten-4506", "Handwritten-4668", "Handwritten-4679", "Handwritten-4771", "Handwritten-4892", "Handwritten-5073", "Handwritten-5141", "Handwritten-5536", "Handwritten-6095", "Handwritten-6114", "Handwritten-6198", "Handwritten-6544", "Handwritten-6555", "Handwritten-6564", "Handwritten-6604", "Handwritten-6758", "Handwritten-6793", "Handwritten-687", "Handwritten-7154", "Handwritten-7242", "Handwritten-7319", "Handwritten-7815", "Handwritten-7980", "Handwritten-8190", "Handwritten-8221", "Handwritten-8249", "Handwritten-8290", "Handwritten-8295", "Handwritten-8357", "Handwritten-8440", "Handwritten-8450", "Handwritten-872", "Handwritten-8812", "Handwritten-8852", "Handwritten-9211", "Handwritten-9220", "Handwritten-936", "Handwritten-952", "Handwritten-9641"]}

================================================
FILE: meta/kor_split.json
================================================
{"train": {"fonts": ["UhBee Rami.ttf", "UhBee DoolDool.ttf", "UhBee ddolyoung.ttf", "UhBee Jisyuk jisyuk.ttf", "UhBee My Husband.ttf", "UhBee Sunhong.ttf", "UhBee song.ttf", "UhBee chae-eun.ttf", "UhBee mingi calli.ttf", "UhBee Jin-gun.ttf", "UhBee KOR.ttf", "UhBee RingRing.ttf", "UhBee UZ.ttf", "UhBee HYUNJUNG.ttf", "UhBee freak researcher minani.ttf", "UhBee UJong.ttf", "UhBee JJIBBABBA.ttf", "UhBee Yeonie.ttf", "UhBee jung.ttf", "UhBee DDOYO.ttf", "UhBee Jiyoung.ttf", "UhBee KeongKeong.ttf", "UhBee hye mong.ttf", "UhBee Jjipungding.ttf", "UhBee dami.ttf", "UhBee ann.ttf", "UhBee Hyeki.ttf", "UhBee Namjieun.ttf", "UhBee EUN KYUNG.ttf", "UhBee Kang-Ja.ttf", "UhBee Soyun.ttf", "UhBee ARyong.ttf", "UhBee TOMO.ttf", "UhBee mysen.ttf", "UhBee puding.ttf", "UhBee Banynany.ttf", "UhBee Ryuga.ttf", "UhBee Yiseul.ttf", "UhBee namsoyoung.ttf", "UhBee MinAhBang.ttf", "UhBee Rice.ttf", "UhBee yul.ttf", "UhBee Se_hyun.ttf", "UhBee wocked woman.ttf", "UhBee QUEEN J.ttf", "UhBee BongSik.ttf", "UhBee Mardyu.ttf", "UhBee kairu mischief.ttf", "UhBee matsuko.ttf", "UhBee Motomi.ttf", "UhBee Minidori.ttf", "UhBee Hanbee.ttf", "UhBee baby.ttf", "UhBee mun seul ye.ttf", "UhBee ibuson.ttf", "UhBee Simple girl.ttf", "UhBee Joker.ttf", "UhBee yoonjaa.ttf", "UhBee BEOJJI.ttf", "UhBee Miwan.ttf", "UhBee Tokki.ttf", "UhBee ZIGLE.ttf", "UhBee DongKyung.ttf", "UhBee swit.ttf", "UhBee yoongdi.ttf", "UhBee Gmin2.ttf", "UhBee Strawberry.ttf", "UhBee yehee.ttf"], "chars": ["\ud4cc", "\ubda4", "\ud4df", "\uca00", "\ub000", "\uc5f6", "\ub385", "\ud37c", "\ucd18", "\uce0c", "\ucda4", "\ub879", "\ub7a9", "\uc800", "\ucde8", "\uc3e0", "\uaca0", "\uc885", "\uc6e9", "\ud69f", "\uc501", "\uaecc", "\ub053", "\ud391", "\ucdfd", "\ub215", "\ub791", "\uccf0", "\uc245", "\ud658", "\uc9ca", "\uc069", "\ub648", "\uc0dd", "\uacb9", "\uc7c0", "\ud044", "\ub82c", "\ud2c8", "\ub450", "\uc740", "\uc0b0", "\ud39c", "\ub7f4", "\ud2ac", "\uc2ac", "\ub144", "\ub975", "\ud45c", "\uc234", "\uacec", "\ub530", "\uc204", "\uc704", "\uba69", "\ud460", "\ub268", "\ud79b", "\ucf11", "\uc6c0", "\ud3c4", "\uac04", "\uc314", "\uc737", "\ub54c", "\ucacd", "\uc388", "\uc5ff", "\ucd6d", "\ub134", "\uc880", "\uc5ed", "\uacb8", "\uadf9", "\ub46c", "\ud140", "\ubdd8", "\ubb36", "\ud62d", "\ubc25", "\ud78c", "\ubee0", "\uad8c", "\ud33b", "\ubcf4", "\ub2ef", "\ub08f", "\uba4d", "\ub19c", "\ub0b4", "\ud300", "\uc65c", "\uce31", "\ub0ae", "\uaf0d", "\ubba8", "\ub611", "\uae5c", "\uce94", "\uaebd", "\ub458", "\ud64b", "\uc49c", "\ud2f4", "\ubc9a", "\ud6d4", "\uc12d", "\ubf1c", "\ubc99", "\uac08", "\ud0ec", "\ub123", "\ubd18", "\ucc3d", "\uc448", "\ub808", "\ub110", "\uc21f", "\ucf70", "\uc1f0", "\uc258", "\ub2dd", "\ub41c", "\uc4b8", "\uc1f3", "\ubb3b", "\ub2f4", "\ub9e8", "\uc790", "\ucc75", "\uc625", "\uc9f0", "\uc27f", "\ub7a0", "\ucb50", "\uc570", "\ud482", "\ucc66", "\ub35c", "\ub4e4", "\ud3a0", "\ubc44", "\ub18b", "\uccec", "\uc7a3", "\ucdc4", "\uc164", "\uc9c1", "\uc82d", "\uc324", "\uc571", "\ubfdc", "\ubcb4", "\uae4e", "\ub0e0", "\uc66f", "\uc068", "\ud018", "\uc480", "\ub9f9", "\uc981", "\ud55c", "\uc6fd", "\ub0d0", "\uac9c", "\ub463", "\ub9f4", "\ubc49", "\uc6dc", "\ucca9", "\uc0d3", "\ub35f", "\ucb20", "\uc5fd", "\ub365", "\ucad9", "\ub8f0", "\ub792", "\uc630", "\ub08c", "\uc20f", "\ubcbc", "\ud0d4", "\ud480", "\ub5a1", "\ud6fd", "\ub9f5", "\ud281", "\ud540", "\ub748", "\uc1d7", "\ud5d0", "\ud1a8", "\ud380", "\ubee4", "\ucad3", "\ucd64", "\uae34", "\ud004", "\ud398", "\ub205", "\uc7d8", "\ud790", "\uac5c", "\uba4b", "\ub004", "\ub31c", "\ucf85", "\uc5a9", "\ub18d", "\ucf19", "\uce69", "\uc568", "\uaff8", "\ub5b4", "\uc637", "\uc0a0", "\uc6f8", "\uaff0", "\uc724", "\uc840", "\ud53c", "\ud145", "\uc044", "\ucc58", "\ub5d1", "\ud639", "\uc9ed", "\ud76c", "\ud5cc", "\ud6d9", "\ucb79", "\ub2cc", "\uca54", "\uafd8", "\ud32c", "\ub54d", "\ud587", "\ucf69", "\ub4e6", "\ucef9", "\ud390", "\uac84", "\uac38", "\ud0dd", "\ucef4", "\uc6df", "\ub951", "\ub773", "\ubc31", "\ud649", "\ucabd", "\uc6c5", "\uc1a1", "\ucc68", "\ub1cc", "\uae09", "\ub614", "\ub518", "\uc14c", "\ubcf6", "\ub9d2", "\uc11d", "\ubf55", "\uc58f", "\uc104", "\ub381", "\uc26c", "\ud620", "\ucd95", "\ub141", "\uae61", "\ud4e8", "\ud050", "\ubc1c", "\uac2d", "\uaebe", "\ucd5d", "\ud30c", "\ub0e5", "\uc2fb", "\uc290", "\uac83", "\uc3e2", "\uc138", "\ub839", "\uc329", "\ucb78", "\uac14", "\uc4d4", "\uc883", "\uc12c", "\uc6b8", "\uad74", "\ucac0", "\uca60", "\ub525", "\ubb58", "\ubfc5", "\ucc3e", "\uc92c", "\ubb6c", "\ube5b", "\uc82c", "\ud320", "\ud284", "\ub220", "\ud551", "\ub9d1", "\ub5d8", "\uadfc", "\uace7", "\ucfe0", "\ud601", "\ud585", "\uae46", "\ubd8a", "\ucaec", "\ub3e8", "\uc77d", "\ud5e5", "\ud15c", "\ub451", "\uc05c", "\ub2f7", "\uc59c", "\uae60", "\ub969", "\ud0d0", "\uaf3c", "\uad7b", "\uafc0", "\uc5d8", "\uc600", "\uc19f", "\uac09", "\ub540", "\ud651", "\ucc70", "\ud3fc", "\uc5e3", "\uaca9", "\uac10", "\uc560", "\uca14", "\ubb47", "\uc36c", "\uaed0", "\ub04c", "\ubf40", "\ud15f", "\uc27d", "\uacb0", "\uc624", "\uafa4", "\ub768", "\uc7a1", "\ub028", "\ud329", "\ub584", "\uc060", "\ubb0f", "\uca0b", "\uc2e4", "\uc158", "\ub7fc", "\ud17c", "\ub0bc", "\ucfe4", "\uc911", "\uc61b", "\uafb9", "\uacc4", "\uba87", "\uc561", "\ud64d", "\ud610", "\uc881", "\uba58", "\ub0a9", "\ubfb0", "\ud645", "\ubab8", "\uad2d", "\uba48", "\ub2c8", "\uc318", "\uc5c5", "\uaf32", "\uc97c", "\uc379", "\ud035", "\ud2b8", "\uc5cc", "\ubc85", "\ucd24", "\ub1df", "\ub315", "\ube1f", "\ub380", "\ubed7", "\ubdd4", "\ucae0", "\uce6d", "\ud6bd", "\ucc38", "\uac90", "\uc5e0", "\uba53", "\ubcc0", "\ucd0c", "\ub775", "\uc774", "\ud3fd", "\ud0e4", "\uc11e", "\ucd98", "\ub0d4", "\uafb1", "\uc004", "\ud654", "\uc10b", "\uad2c", "\ucc9c", "\ud5c8", "\uc694", "\ubcd1", "\uadc0", "\uce04", "\ube70", "\ud3ec", "\ub3d9", "\ubcdc", "\ud2d4", "\ube44", "\ub0b3", "\uacc8", "\uc6dd", "\ud569", "\uc091", "\ucec1", "\ud4f8", "\uc479", "\ub5a8", "\uac20", "\ub4e3", "\ubdc0", "\uc464", "\uadd1", "\uad81", "\ub8e8", "\uc2eb", "\uac8a", "\uaf2d", "\uc2a8", "\uce78", "\uba01", "\ub0c5", "\ub985", "\ub2aa", "\ub5b1", "\uad44", "\uad18", "\ub95c", "\uc988", "\uc8e1", "\ud720", "\uad6d", "\uc640", "\ub369", "\ud0c1", "\ub668", "\ud3f0", "\ub8a8", "\ucb2c", "\uae01", "\uae41", "\ub128", "\uc575", "\ucb30", "\ud758", "\ubc2d", "\uceb4", "\uc5fe", "\ub9d0", "\ubc8e", "\uc0e4", "\ucffc", "\ud0d3", "\ud41d", "\uc74e", "\ubdf8", "\uc1e0", "\uc228", "\ucf65", "\uace8", "\ub4dc", "\uc9d9", "\uafe9", "\ucc28", "\uac15", "\ub514", "\ud478", "\ub6b1", "\uc325", "\ubab2", "\ud130", "\ucf55", "\uba65", "\uc544", "\uc2fc", "\ub5aa", "\uc051", "\ube8d", "\ucdf0", "\ud22d", "\ud479", "\uae4a", "\ucddf", "\uc650", "\uc801", "\ub428", "\uc139", "\uae7c", "\ub3db", "\uc1d8", "\uba71", "\uc698", "\ub358", "\ub9bc", "\ube10", "\ub4ef", "\uba42", "\ubc1d", "\uae68", "\uc2ef", "\uc61c", "\ud700", "\ud667", "\ub0a1", "\uc708", "\uad11", "\ud1b5", "\uce90", "\uc555", "\ub2f3", "\uc0f9", "\ud141", "\ub838", "\uadec", "\ube73", "\uad58", "\ucd28", "\ubed1", "\ubd04", "\ubc8c", "\uc768", "\ube1c", "\ud6f0", "\uc9dd", "\uc6b0", "\uc688", "\ub7c9", "\ud207", "\ud6e4", "\uc728", "\ub25c", "\uba4e", "\uc2ed", "\ucacc", "\uaf64", "\ube98", "\uacac", "\uc3f5", "\ud648", "\ucad1", "\ubd58", "\uc5c4", "\uc78a", "\ud4d0", "\ucbb8", "\uc514", "\ud718", "\uc57d", "\ud6c8", "\uc0bf", "\ud264", "\ubc17", "\uac2f", "\uc9c7", "\ud2c0", "\uc00d", "\uc75c", "\ud685", "\ud408", "\uc154", "\ubb38", "\ub8c1", "\ubd40", "\uba84", "\uc3a0", "\uc168", "\ud401", "\ubc1b", "\uacf5", "\uce29", "\uc906", "\uc58d", "\ud670", "\uc475", "\ud69d", "\ub515", "\ud655", "\ub189", "\uccb5", "\uc155", "\ud614", "\uaf84", "\uc958", "\uac3c", "\uc9ec", "\uac85", "\ucbe9", "\uc824", "\uba00", "\ubc45", "\uba39", "\ucff1", "\ud0d5", "\uafcd", "\ud0a5", "\uc370", "\ud568", "\ucefc", "\uc88b", "\ube59", "\uc0b4", "\uaf08", "\uc4f0", "\ubb20", "\ud47c", "\uad04", "\ub429", "\uc2f1", "\ud46d", "\ubca7", "\uc298", "\ub729", "\uc7d0", "\ub878", "\uc796", "\ucb59", "\uafe8", "\ub370", "\uc0b5", "\ub5bb", "\ucc98", "\uac16", "\uc7a0", "\uc0d9", "\uc100", "\ub560", "\uc31f", "\uac77", "\ub761", "\ubc30", "\uad47", "\uc0ec", "\ub36e", "\ub404", "\ub8b0", "\ub057", "\ub819", "\uc131", "\uae56", "\uc641", "\ub4b5", "\uc200", "\ucd09", "\uc260", "\uc798", "\ub4f1", "\uacfc", "\uaed9", "\uce8c", "\ubcc4", "\ub809", "\uc963", "\ub0a2", "\uc14d", "\ud06d", "\uc813", "\uc79a", "\ubd80", "\ub00c", "\ubd91", "\uae7b", "\uc0c1", "\ucd19", "\ub091", "\ud4fd", "\uc65d", "\uc2b5", "\ud558", "\ubc0c", "\ucc55", "\ub989", "\uc67c", "\ud734", "\ub099", "\uc635", "\uccc4", "\ub3dd", "\ud444", "\ubbb4", "\ud3ff", "\ube61", "\ubc29", "\ub9ce", "\uc20c", "\ud640", "\uc434", "\ubb4d", "\uae00", "\ub8b8", "\ub384", "\uc3f4", "\uca18", "\ud6ac", "\ub6f4", "\ucb5d", "\uc784", "\ubd89", "\ubbb7", "\ud234", "\ucdb0", "\uade0", "\ube68", "\uba55", "\ub9b4", "\uc2ec", "\uc573", "\ucd94", "\uad7f", "\ud2f8", "\ubb54", "\uc52c", "\ub112", "\uce15", "\uc3df", "\uc900", "\uc090", "\ud0ed", "\uc3e9", "\ub764", "\uae3a", "\uc6e8", "\ud559", "\ub119", "\uba08", "\ub01d", "\uc22b", "\uc110", "\ucfa1", "\uc870", "\ud711", "\uc530", "\ud07c", "\ud5d8", "\ub2d0", "\uc232", "\ub528", "\uc15c", "\uc88c", "\ud3ad", "\ud0f8", "\uce59", "\ubdb8", "\ub801", "\uc1bd", "\ud50c", "\uaecf", "\uc5b5", "\ub531", "\ucd6c", "\ub1dc", "\uc778", "\ub269", "\uc30c", "\ubad8", "\ud46f", "\ucc44", "\ud131", "\ub55d", "\uc8d9", "\ub94c", "\ub5bc", "\ub545", "\uc720", "\ucb49", "\ube90", "\ub73d", "\ud316", "\ucdec", "\ub860", "\uc1d4", "\ub0d1", "\ubc88", "\uae0d", "\ub29a", "\ud23f", "\ub2ed", "\ubc24", "\ucf30", "\ub55c", "\ub8e1", "\ub135", "\ucea1", "\uc0f7", "\ub554", "\ub527", "\ucc0d", "\uc1e4", "\uc43c", "\uac1b", "\ud0ac", "\ubbff", "\uae14", "\uad35", "\uc731", "\ud440", "\ud47f", "\uc760", "\ubd93", "\uc468", "\ub78d", "\ud184", "\uc169", "\ud72d", "\ud573", "\uccc9", "\uc34c", "\uc60c", "\ub0ad", "\uaf88", "\ub960", "\ubf94", "\ub825", "\uaf3f", "\uc88d", "\ud241", "\ucea4", "\ubd48", "\uc7b4", "\uc894", "\uce5f", "\ud624", "\uaf65", "\uac30", "\ubd07", "\ubd50", "\uc954", "\uadd3", "\uae84", "\uc58c", "\ucf00", "\ub5bd", "\ud515", "\ub01c", "\ucc3c", "\ub2f8", "\ud763", "\ub3d4", "\ub770", "\uc695", "\uaf9c", "\uc4e9", "\uacf1", "\ub853", "\uc54e", "\uc639", "\uc13c", "\uac81", "\ud2f0", "\uac8c", "\ub2a5", "\uacaa", "\uc37b", "\ucfc8", "\uad54", "\ud2cb", "\ud72b", "\ub9dd", "\ud77c", "\ucb14", "\ub529", "\uac9d", "\uc791", "\ud6b9", "\uad20", "\ub0ac", "\uc4af", "\ub771", "\ubfcc", "\uc81d", "\ub534", "\ucdc3", "\uae5f", "\uc671", "\ub4c8", "\ubc11", "\ub79c", "\uc816", "\uc9e7", "\uc6a5", "\uac71", "\ud321", "\uc3d8", "\uc680", "\ubde9", "\ub987", "\uca7d", "\ud54d", "\ubca8", "\ud291", "\ubb61", "\ucc57", "\ud280", "\ucf04", "\ub7ac", "\ucd6f", "\uc0cc", "\uc77e", "\ub4ec", "\uccd4", "\uc4f4", "\uac74", "\uc0b3", "\ub9ad", "\ud011", "\ucda9", "\ucb08", "\ubca0", "\ucdf8", "\ucfb0", "\ud328", "\ub139", "\uca5d", "\uc2b9", "\uc905", "\ub27c", "\ud2c9", "\ubc1f", "\ub0c4", "\uc0f4", "\ub461", "\ub454", "\uc3b5", "\ub374", "\uc54c", "\uaccc", "\ubd95", "\ub3c4", "\ube4e", "\ud751", "\ube45", "\ucbe4", "\ud3ed", "\uac86", "\ud578", "\uc1e8", "\uc251", "\uacd7", "\ub705", "\uc12f", "\uc564", "\uccab", "\uc0dc", "\uc90d", "\ud265", "\uaf41", "\uc328", "\uc123", "\uc22f", "\ubdd5", "\ud0a8", "\uc270", "\uaf10", "\ub2ec", "\ub8fd", "\uac1c", "\uc810", "\ub8c5", "\ud611", "\ub8fb", "\uadc8", "\uad76", "\ucfa8", "\uc77c", "\ub730", "\uc874", "\ucacf", "\ub74c", "\ud781", "\uc68d", "\ub204", "\uaee8", "\ub192", "\ucf5c", "\ucb64", "\ubb49", "\uacbc", "\uc3d9", "\ubcb5", "\ud760", "\uca0c", "\ub920", "\ud608", "\uc0c5", "\uc2ad", "\ucda7", "\ucead", "\ub40d", "\uc148", "\ub194", "\ud070", "\uc43d", "\uc2a4", "\ud295", "\ub5d0", "\ubaab", "\uc679", "\ubc0b", "\ud14c", "\uc19c", "\ubcbd", "\ub2d9", "\ub7b2", "\uc2f8", "\ub6a0", "\ub738", "\uc372", "\ubb00", "\ub9c1", "\ubbc8", "\ucf38", "\uc9fc", "\ucce4", "\ubf18", "\uc5fc", "\ud48d", "\ub371", "\ub219", "\uc752", "\uc595", "\ud209", "\ucc3b", "\ub77c", "\uac17", "\uc90f", "\ucc45", "\ud15d", "\ub5c0", "\ub285", "\uba8c", "\uc538", "\ub193", "\ub86d", "\uba85", "\uc653", "\uc9e2", "\uad1c", "\uc216", "\uc27c", "\ub3cc", "\ub55f", "\uceec", "\uc601", "\ub05d", "\ubc34", "\uba3c", "\ubaa8", "\uc705", "\ud344", "\uce61", "\ube8c", "\ud57c", "\ud2d8", "\uae31", "\ubb0d", "\ube00", "\uccd0", "\ub634", "\ub4a8", "\ud5d2", "\uc19d", "\uc651", "\ub2e2", "\uca08", "\uc384", "\ub5ab", "\ud6cd", "\uc53b", "\uc218", "\ub9db", "\ub23c", "\ubb3e", "\uafce", "\uc354", "\ubafc", "\ud33c", "\ub178", "\ucf08", "\uc53d", "\uc619", "\uca0d", "\ud1d8", "\uc554", "\uaf07", "\uc5bd", "\uc6a4", "\uc167", "\uaca8", "\uba40", "\ubaac", "\uc775", "\ucd5c", "\ud02d", "\ub084", "\uc6c1", "\ub2a3", "\uac19", "\uc89f", "\ud3e3", "\ube7b", "\ub4a4", "\ud0dc", "\ub851", "\uae37", "\uc408", "\ucdd0", "\ub2e8", "\ub700", "\ub7ff", "\ub180", "\ucc10", "\ud754", "\ub188", "\ube03", "\ud29c", "\uc8bd", "\uc6ba", "\uc5e1", "\ubaa9", "\ub5b3", "\uad1e", "\ub3fc", "\uc474", "\ub2fa", "\ubea8", "\ud744", "\ub137", "\uba5c", "\uc313", "\ub7ed", "\uc424", "\ud671", "\uad0f", "\uc529", "\ud735", "\ub85d", "\ud0b4", "\ub824", "\uc804", "\uce75", "\uae45", "\ud6df", "\uc0a5", "\ub6a4", "\ub9d8", "\ud3d8", "\ucf10", "\uc127", "\uc1c4", "\ub354", "\ub2d2", "\ud4dc", "\uaec0", "\ud2e4", "\ucb18", "\ub800", "\ucff3", "\uc37d", "\uac9f", "\uad3c", "\uc9f8", "\ub968", "\uac89", "\uc4ff", "\uaef4", "\ud144", "\ucf20", "\ub77d", "\uc74a", "\ubbf9", "\ud188", "\uc660", "\uae0b", "\uac31", "\ucf2c", "\ud330", "\uc81c", "\ub355", "\uac4b", "\uce20", "\uc820", "\ucc59", "\ubb44", "\ud63c", "\uc950", "\uada4", "\ud757", "\ub40f", "\uc0c9", "\ub3c8", "\ub541", "\uc84c", "\uca30", "\uc84b", "\ud1b0", "\ub6f0", "\ud79d", "\ub98e", "\ucb41", "\uc80a", "\uba70", "\ube6a", "\ubc50", "\uc8a8", "\ub0b1", "\uce6b", "\ud0b9", "\ud2bc", "\ub98d", "\ub108", "\uc4f8", "\ub198", "\uad49", "\ucef8", "\ucea0", "\ucca0", "\ucea5", "\uac8b", "\ub1d4", "\ud68c", "\uc6f0", "\ub7b4", "\ubcf5", "\uc8cc", "\ucabc", "\ub9ec", "\ub04e", "\ub9e5", "\ubd24", "\ud6b0", "\ub045", "\ud3c5", "\uca50", "\uc098", "\ud565", "\uc4f1", "\ud33d", "\uc9f9", "\ubf48", "\ubed0", "\ucc21", "\ud68d", "\uc5d0", "\uc219", "\ubb1c", "\ubc97", "\ub86c", "\uacbd", "\uaf91", "\uceeb", "\ub480", "\uad38", "\uc608", "\uc126", "\uace4", "\ud0d1", "\uadd0", "\ud310", "\ucdf9", "\ud575", "\ub217", "\ub390", "\ub301", "\uc510", "\ub20c", "\ucbe7", "\ub5ec", "\ud6d5", "\uc751", "\uaf2c", "\ubad9", "\ub275", "\ubd81", "\uc8d5", "\ub3ce", "\ub2f9", "\ub0c9", "\uaddc", "\ub155", "\ud054", "\ud290", "\ud5db", "\uc8bc", "\ube8f", "\ub2fb", "\uac12", "\ucfe8", "\uc178", "\ucc0c", "\uc058", "\uac40", "\uc5bb", "\uac94", "\ub304", "\uba67", "\uc274", "\ub113", "\ub4f8", "\ubeb4", "\ud339", "\ube7c", "\ub760", "\uac78", "\uc998", "\uc735", "\uadf8", "\uade4", "\ub36b", "\uacbb", "\ub274", "\uc345", "\ud0a4", "\ucd1d", "\ud16c", "\uafc9", "\uc73d", "\ud2a4", "\uaf90", "\uce14", "\uc2b4", "\uca29", "\ub488", "\uc220", "\ucf67", "\ub04a", "\uad0c", "\uc03c", "\uad7d", "\ub7a8", "\ub208", "\uca68", "\ubd49", "\uba68", "\ucd71", "\uc0d2", "\ud143", "\ud0f0", "\uc309", "\ube84", "\uc607", "\ud3c9", "\uc918", "\uc887", "\ud5c9", "\uc1fd", "\ub51b", "\uc63f", "\ubf01", "\ubb3d", "\uc98c", "\ubc95", "\ubf51", "\uaff1", "\uc9d1", "\ub5b5", "\uae6c", "\uc00c", "\ub148", "\ud615", "\uce60", "\uc7a6", "\ub85c", "\uba38", "\ud590", "\uc757", "\uc999", "\ud399", "\uc990", "\ub2c9", "\ub383", "\uad0d", "\uae50", "\ud73c", "\uc0d0", "\ub1fd", "\ud2b1", "\ucd78", "\uc368", "\ucf31", "\ud1f8", "\ud074", "\ub1f0", "\uc730", "\uc559", "\ud37d", "\ud134", "\ubd14", "\ube1d", "\ub17c", "\ub959", "\uadc1", "\uc44c", "\uc7c9", "\ubddc", "\ub0a8", "\uaed1", "\uc4fa", "\ub3a1", "\uc5c8", "\uc6c3", "\uc1a9", "\ub4d0", "\uad61", "\ub798", "\ucee4", "\ud3a8", "\uc1a5", "\ucee5", "\ub3c5", "\uc20d", "\uc717", "\uba64", "\ud5d9", "\ucef7", "\uc51c", "\ubb3c", "\uc6cd", "\uc115", "\ud081", "\ubf19", "\ud6d7", "\uc7c8", "\ud58f", "\ubdc1", "\ud038", "\uc99b", "\ud14d", "\ubc4c", "\ubccd", "\ucf2d", "\uc633", "\uc815", "\ud65c", "\ub625", "\uba54", "\ub974", "\ud6a1", "\ube74", "\ucd9c", "\ub93c", "\uc6e1", "\uc0c0", "\ub4e0", "\uc6f9", "\ucc64", "\uc140", "\uc5c6", "\uc87a", "\uc465", "\ucc30", "\ud6e8", "\ub6ab", "\ubc38", "\uca09", "\ud1ba", "\uae8c", "\uc848", "\ub797", "\ud5a5", "\ub014", "\uc120", "\uad73", "\uc5ec", "\uce74", "\uc811", "\uac00", "\uc42c", "\ubd90", "\uae7d", "\uc5b8", "\uc9d0", "\uac58", "\uc7bf", "\ub1fb", "\uc7b0", "\ub80c", "\uacf3", "\uc170", "\ub755", "\ube48", "\ubdf4", "\uc0b6", "\uc3e8", "\uc7dd", "\uae54", "\ubd05", "\ud489", "\ub1a8", "\ud759", "\ud5e8", "\ud2c2", "\uccb4", "\ub0d8", "\uc871", "\uc8f5", "\ud694", "\ud2bf", "\uaf79", "\uadc4", "\ucbd4", "\uc890", "\ub8d0", "\uc8a1", "\uafbc", "\uba78", "\ucd1b", "\ud1a1", "\uae5d", "\uc597", "\uc54d", "\ub818", "\ucd01", "\ub11c", "\uc0fe", "\uc0bd", "\ub51c", "\ud150", "\uad82", "\ub364", "\uac24", "\uc73c", "\ub0a0", "\uc549", "\ub055", "\ub780", "\ubd4c", "\ud56d", "\uc229", "\ub2b0", "\ubb35", "\ub2b4", "\ub54b", "\ub9e4", "\uc289", "\ud4a9", "\ub4d5", "\ub299", "\ub098", "\ubcb3", "\ud6c5", "\ud161", "\uaf30", "\uba15", "\ubc18", "\ub7b8", "\ucf78", "\ud6f5", "\uc7ec", "\ud61c", "\uc26d", "\ub4b7", "\ud2b9", "\uaea0", "\ud690", "\ub918", "\ub2f5", "\uc664", "\uacc1", "\uca61", "\ub86f", "\ucc27", "\ub182", "\uad6c", "\uc961", "\uc136", "\ubcb0", "\ub465", "\uc634", "\uccc5", "\uca84", "\ud494", "\uaeeb", "\ud56b", "\ud4fb", "\ub284", "\uc5d1", "\ucc60", "\uaf48", "\ucc54", "\uae4c", "\ub754", "\ub81b", "\ud2dc", "\ud168", "\ud613", "\ud045", "\uca5c", "\uacef", "\ubcf8", "\uc2b7", "\uc557", "\ubb4f", "\uc96c", "\ub2ff", "\uc539", "\uc0bc", "\ubab9", "\ud31f", "\ud756", "\uae30", "\ubca1", "\ub701", "\uc84d", "\uad9d", "\ucd60", "\uccc7", "\ud5e4", "\uc644", "\ub9f7", "\ub420", "\ucff5", "\ud774", "\ub807", "\uc6b9", "\ub3d0", "\uc31e", "\ud5f5", "\uc8fc", "\uc783", "\uca98", "\uba74", "\uc18d", "\ub260", "\ub07d", "\uc55d", "\ud54c", "\ud1a4", "\ubcd0", "\ub214", "\ud060", "\uc788", "\ub9de", "\ud6e0", "\uc1f1", "\ud750", "\ubf41", "\ud03c", "\ub138", "\uc789", "\ub96d", "\ud0c4", "\uacea", "\ubed4", "\uc7bd", "\ucd2c", "\uc90c", "\ub400", "\ub310", "\ud2f1", "\ub8d4", "\ud508", "\ubc94", "\ub87c", "\uaecd", "\uce08", "\ud303", "\uc2e3", "\ub7ad", "\uc3c0", "\ub799", "\uc3f8", "\ub88d", "\uc558", "\ub151", "\ub864", "\ubb63", "\uad75", "\ub44f", "\ub460", "\ub78f", "\ub0c8", "\ud504", "\ud07d", "\uce35", "\uc185", "\ub8f8", "\ub291", "\ub109", "\ub158", "\uc6b1", "\ubc84", "\uc574", "\uaf5d", "\ub7b5", "\ud719", "\uc960", "\uad50", "\uc0d8", "\ubf1d", "\ud305", "\ub1e8", "\ubabb", "\ub35e", "\ud38c", "\uce28", "\uaec4", "\uc8e0", "\uc38c", "\uad9c", "\ub2eb", "\ub054", "\uc50c", "\uaf34", "\ubcfc", "\ud1f5", "\ud560", "\ub5cc", "\ud2e5", "\ud514", "\ub4c0", "\uc7cc", "\ub7ec", "\uc494", "\uc4bc", "\uce19", "\ub550", "\ud4d4", "\uaf95", "\ud3a9", "\ube99", "\ub81d", "\uac54", "\uc68b", "\uce30", "\ud3bc", "\uc591", "\ub94f", "\ubc09", "\ub9b0", "\ub6ac", "\ucc14", "\ub543", "\ube7d", "\uc254", "\ubf09", "\ub524", "\ub62c", "\ub1d0", "\ub2ac", "\uad45", "\ud683", "\ub9cc", "\uc330", "\ubc5d", "\ubc14", "\uccad", "\ubd99", "\ucf01", "\ub313", "\ucc2e", "\ub1f9", "\ub3a0", "\ube75", "\ud3b4", "\ub2a6", "\ub0af", "\uca4c", "\uc31c", "\ud277", "\uc300", "\uc62e", "\ubc4d", "\ubac8", "\uafcb", "\uc580", "\uc30d", "\ub294", "\uc610", "\uae4d", "\uc76b", "\uc69c", "\ube91", "\uc808", "\uaf43", "\ud544", "\ub4ed", "\ubc27", "\ud31c", "\uccac", "\ud301", "\ud5f4", "\ub8c0", "\ubdf0", "\ub561", "\ube14", "\ubd09", "\uc753", "\ucc29", "\ud798", "\uc0a1", "\ud669", "\ubb11", "\ub52a", "\uc0e8", "\ub4b9", "\ub3e4", "\uc14b", "\uad90", "\uc410", "\ub418", "\uc755", "\ub837", "\ud704", "\ucdcc", "\ubeec", "\uce84", "\ubbd3", "\uc0ac", "\ub09f", "\uaeed", "\ub8c3", "\uc430", "\uc6a7", "\uc89d", "\uaf42", "\ub118", "\uac7a", "\ud13a", "\uc758", "\uaef8", "\uc0e5", "\ud100", "\ud604", "\ub300", "\ub3d7", "\uc5e5", "\ud10d", "\ucd08", "\uc28c", "\ub9c9", "\ub394", "\ucf80", "\ud588", "\uc785", "\uac1d", "\ud0b7", "\ud23c", "\uccbc", "\uad06", "\ud788", "\ub048", "\ud464", "\uc628", "\ubee3", "\uc357", "\ud248", "\ub12c", "\uc82f", "\ud5dd", "\uc6cc", "\uae43", "\ud769", "\uc1ac", "\ud38f", "\ucea3", "\ubb90", "\ub0ab", "\uc2dc", "\ub258", "\ub93d", "\uc9a4", "\ub11d", "\uc57c", "\uc9c0", "\ub72c", "\uc2dd", "\uae85", "\uc37c", "\ub538", "\ud4f0", "\uce98", "\uaff4", "\ucca8", "\ud6cc", "\uc74f", "\ub3e0", "\ubd9c", "\ub311", "\uba49", "\uc714", "\ub835", "\ubc08", "\uc2a5", "\uad70", "\ud3f4", "\ubb8c", "\uc29b", "\ubc1e", "\uc248", "\ub314", "\uc338", "\uc7a5", "\uc21c", "\uc9d3", "\ud6d1", "\ub125", "\ud0c0", "\uc838", "\ub894", "\ub9d9", "\uc3ed", "\ucfe1", "\uc618", "\uc7c1", "\uc6a9", "\uc74d", "\uc250", "\ud000", "\ubbfc", "\uaed8", "\uac0a", "\ud3d0", "\ubb34", "\ubf08", "\ub160", "\ud3b8", "\uc55e", "\uc263", "\uc83c", "\uc211", "\ud210", "\uad29", "\uc989", "\ubb18", "\ub544", "\uce7c", "\ubc8b", "\uaedc", "\ud48b", "\uc655", "\uc7e8", "\uc715", "\uc648", "\ubb50", "\uc886", "\ub080", "\ub2db", "\uccb8", "\uc3dc", "\ucd39", "\ub940", "\ub42c", "\uce85", "\uc0c8", "\uae78", "\uce33", "\ud54f", "\uc584", "\uc22d", "\ub9f8", "\ubcd8", "\uc6d0", "\ud5ec", "\ubb2b", "\uadff", "\uc719", "\uc0db", "\uc0ad", "\ub308", "\ub49d", "\ud38d", "\ubc41", "\ub0b5", "\ub664", "\uc308", "\ube60", "\ub0e3", "\uc9c8", "\uc18c", "\ub410", "\uc194", "\ubca4", "\uc970", "\ub568", "\ud6bb", "\uc1fc", "\ucd10", "\ub610", "\ub3d5", "\ucf24", "\ub289", "\ub09a", "\uc0a3", "\ubd84", "\ub4dd", "\ub796", "\uc1b0", "\ucf58", "\ub140", "\uc528", "\ud0c9", "\uc545", "\ub1ec", "\uafb8", "\uc7ce", "\ub5a0", "\uc689", "\ud1a0", "\uc288", "\uc8e4", "\ud765", "\ubc40", "\uc5ee", "\uac4d", "\uafdc", "\uc7a4", "\uce58", "\ucc2c", "\ub2ee", "\uc794", "\ub3ac", "\uac07", "\ub7f0", "\ud1f4", "\ucfc4", "\uac70", "\ub4ac", "\uc5ca", "\ud325", "\ubc02", "\ucaf4", "\ub1e9", "\ubd64", "\uc654", "\ud25c", "\uc54a", "\uc74c", "\ub356", "\uc2f6", "\ub790", "\ube71", "\ubf44", "\ud0ef", "\ub5cd", "\ub378", "\uce87", "\ub0b8", "\ud384", "\ub620", "\ub5c4", "\ub978", "\ub8dd", "\ucc99", "\ud674", "\ubd10", "\uc1a8", "\ucc48", "\ud3ab", "\ub984", "\uad63", "\uc5d4", "\uc108", "\ud31d", "\ubd68", "\uc934", "\ubed8", "\ud06c", "\uce68", "\ub0c7", "\ub11b", "\uc30b", "\ube5a", "\ube80", "\ubb45", "\uc8d4", "\ucc22", "\uc8c8", "\uc7ac", "\uc904", "\ub044", "\ub2e5", "\ub871", "\uce24", "\ud314", "\uc70c", "\uc606", "\ub8b4", "\ub059", "\uc3bc", "\ube55", "\uaf5c", "\ud23d", "\uc29d", "\ubbc4", "\ud230", "\ubfdf", "\ubee5", "\ucc39", "\uafd4", "\ubcb1", "\uc831", "\ub3cb", "\uc0af", "\uac2c", "\ubc0d", "\uc733", "\ubcd5", "\ucf15", "\uc744", "\ud345", "\ub7c7", "\ub08d", "\ud789", "\ub7ab", "\uc378", "\uacd5", "\ub784", "\ub42b", "\uaf49", "\uc165", "\ud1b1", "\ub5a4", "\ud488", "\uc78e", "\uc9dc", "\uc849", "\ub97c", "\ub07c", "\ud0c8", "\uc5b9", "\uac80", "\ud5f9", "\ub844", "\ubd9a", "\ucad8", "\uc500", "\uae38", "\ub73b", "\ubfe1", "\uc7d9", "\uc587", "\ud589", "\uadb7", "\ub10b", "\ubc16", "\ub840", "\ud034", "\uaebc", "\uc9e4", "\ub810", "\ub9bf", "\ub8f9", "\uc598", "\uc10a", "\uc5c7", "\uac1a", "\ud288", "\ud049", "\ud2a0", "\ub8df", "\uc149", "\ub15c", "\uc8d7", "\ubd87", "\uc63b", "\ube0c", "\ud6a8", "\ub290", "\ud058", "\uae44", "\uac11", "\ud0e0", "\uc5bc", "\ub38c", "\uc6e4", "\uc124", "\ucac4", "\ud0f1"]}, "valid": {"fonts": ["UhBee Han HUEY.ttf", "UhBee Howl.ttf", "UhBee LovelyAN.ttf", "UhBee U JEONG.ttf", "UhBee Ham.ttf", "UhBee+Jaeyoun.ttf", "UhBee W yum.ttf", "UhBee HanByeol.ttf", "UhBee GEN WOO.ttf", "UhBee MiMi.ttf", "UhBee Seulvely.ttf", "UhBee charming.ttf", "UhBee YanNeu.ttf", "UhBee eunD.ttf", "UhBee Hyundyu.ttf", "UhBee Skyrain.ttf", "Uhbee NaHyun.ttf", "UhBee Kairu.ttf"], "chars": ["\ucf13", "\uacaf", "\ub20b", "\ucc4c", "\uba83", "\uace0", "\uc548", "\ucb58", "\uaefc", "\uc0f5", "\ucdfb", "\uc9d5", "\ud584", "\uc9da", "\ubb88", "\ucf1c", "\ud5f7", "\uca97", "\uae65", "\ub9bd", "\ud761", "\ub96b", "\ub124", "\uad89", "\ud047", "\uc5f0", "\ud6fc", "\uc99d", "\ubdb0", "\ud138", "\ube54", "\uaf50", "\ubbf8", "\uc78c", "\ucf64", "\uac13", "\uc5f7", "\ucf74", "\ucf54", "\ubc43", "\uc62c", "\ud1b3", "\uace1", "\uaf3d", "\ud3c8", "\ud0b5", "\ub9e1", "\ub9cf", "\ube64", "\ud4b0", "\uc356", "\uba04", "\uacf0", "\uae8d", "\ube05", "\ubccf", "\ub618", "\ud30e", "\ubc0f", "\uae69", "\uaca1", "\uae70", "\ub739", "\ub434", "\ub234", "\ubba4", "\ub09c", "\uad88", "\ud3e1", "\uc974", "\uca4d", "\ud799", "\uc854", "\ubb29", "\ubd88", "\ub744", "\uaf80", "\uc2e0", "\ub728", "\uceac", "\ubbd0", "\ube57", "\ubc00", "\ucb9c", "\uc1cc", "\uc9ef", "\ub6d4", "\uc281", "\uc6e0", "\uc7bc", "\uc6d4", "\ub1dd", "\ub7fd", "\ub298", "\ud22c", "\ud1c0", "\ub9ac", "\uc66c", "\ud600", "\uc797", "\ud738", "\ud749", "\ucb4c", "\ud338", "\uc231", "\uc787", "\uc553", "\ubabd", "\uc2f9", "\uc46c", "\ud77d", "\ub78c", "\uce91", "\ub35b", "\uc8c4", "\ub880", "\ub154", "\ud154", "\uc6ec", "\uc5a0", "\uc9d6", "\uc265", "\uc878", "\ubd79", "\uce5c", "\ubfd4", "\ub944", "\uc5be", "\ub9c8", "\uce21", "\ucff0", "\ud729", "\uad34", "\uc605", "\uacfd", "\uc369", "\ucd88", "\uc7ad", "\ubfd0", "\uae40", "\uae79", "\ub2d8", "\ub958", "\ub179", "\ub367", "\ub2e6", "\ub3a8", "\uc174", "\uc6fb", "\ubd2c", "\ucf2f", "\ucda5", "\uafc8", "\ub9fa", "\uc11f", "\ud53d", "\ub2a1", "\ub5b0", "\ubf1b", "\ub98a", "\uc9c4", "\ud30d", "\uc5ce", "\ub4c4", "\uc756", "\uc190", "\uc951", "\uafc7", "\uad7c", "\ucc1d", "\ucb10", "\ucf71", "\ub8cc", "\uc1c8", "\ub2a0", "\uc5f4", "\ubf50", "\ud1bc", "\uc678", "\ucef5", "\ubd59", "\ucc1c", "\uc5b4", "\uc5c9", "\ud71c", "\uc721", "\ub69c", "\ub001", "\ub150", "\ubd23", "\uce89", "\ubbac", "\ubac4", "\ud747", "\ub904", "\ucb48", "\uae08", "\uae86", "\uc196", "\uc130", "\ubab0", "\uc315", "\ud517", "\ud770", "\uc9f1", "\uc6b4", "\ucee8", "\ube4c", "\uc18e", "\uacf6", "\ub010", "\ubb04", "\ucb21", "\ub834", "\ud4ec", "\uc9e0", "\ud728", "\ud6c4", "\uc754", "\ubc15", "\ub8ec", "\ub2e4", "\uc8fd", "\ub5cf", "\uc92b", "\ub72f", "\uc11c", "\uca5f", "\uac01", "\uc62d", "\uc094", "\ube0d", "\ub8e9", "\uc7e4", "\uad00", "\ud638", "\ubfcd", "\ub69d", "\ud574", "\uac39", "\ub10c", "\ub6f8", "\ub9e3", "\ucf8c", "\ubbc0"]}}

================================================
FILE: meta/thai_split.json
================================================
{"train": {"fonts": ["KaniGa-Regular.ttf", "Aksaramatee-Regular.ttf", "JS-Karabow.ttf", "Purisa-Medium.ttf", "Nakaracha-Regular.ttf", "TH-Mali-Grade6-Regular.ttf", "JS-Samurai-Normal.ttf", "Loma-Book.ttf", "JS-Macha-Normal.ttf", "JS-Chusri-Normal.ttf", "Himmaparnt-Regular.ttf", "SR-FahMai-Normal.ttf", "Taviraj-Regular.ttf", "ChulaNarak-Regular.ttf", "JS-Boaboon.ttf", "Itim-Regular.ttf", "JS-Khunwai.ttf", "Sriracha-Regular.ttf", "JS-Padachamai-Normal.ttf", "JS-Jukaphan.ttf", "JS-Junkaew.ttf", "Pattaya-Regular.ttf", "JS-Saksit-Normal.ttf", "JS-Setha-Normal.ttf", "JS-Pisit-Normal.ttf", "Mitr-Regular.ttf", "TlwgTypewriter-Medium.ttf", "JS-Rapee-Normal.ttf", "Kinnari-Medium.ttf", "TH-Baijam-Regular.ttf", "Athiti-Regular.ttf", "JS-Sarunya-Normal.ttf", "JS-Tina-Normal.ttf", "TH-KoHo-Regular.ttf", "JS-Chawlewhieng.ttf", "JS-Pudgrong-Normal.ttf", "JS-Thanaporn-Normal.ttf", "JS-Saowapark-Normal.ttf", "TH-Charmonman-Regular.ttf", "JS-Prajuk-Italic.ttf", "PSK-Smart-Regular.ttf", "JS-Chalit.ttf", "TH-Chakra-Petch-Regular.ttf", "JS-Obsaward-Normal.ttf", "JS-Chanok-Normal.ttf", "TH-Krub-Regular.ttf", "JS-Puriphop-Normal.ttf", "JS-Duangta.ttf", "TH-Niramit-AS-Regular.ttf", "Garuda-Book.ttf", "JS-Wannaree-Italic.ttf", "JS-Giat-Bold.ttf", "JS-Sangravee-Normal.ttf", "JS-Laongdao-Bold.ttf", "TH-Sarabun-New-Regular.ttf", "FonLeb-Regular.ttf", "Chonburi-Regular.ttf", "JS-Chaimongkol.ttf", "JS-Ninja-Allcaps-Bold.ttf", "JS-Prasoplarp-Normal.ttf", "JS-Amphan-Italic.ttf", "JS-Yodthida.ttf", "JS-Sirium-Normal.ttf", "JS-Pitsanu.ttf", "JS-Pranee-Italic.ttf", "JS-Chulee.ttf", "JS-Angsumalin.ttf", "JS-Neeno-Normal.ttf", "NotoSansThaiUI-Regular.ttf", "JS-Korakhot-Normal.ttf", "TH-K2D-July8-Bold.ttf", "JS-Puchong-Normal.ttf", "JS-Oobboon-Normal.ttf", "JS-Pitsamai-Italic.ttf", "Prompt-Regular.ttf", "Maitree-Regular.ttf", "TH-Fahkwang-Regular.ttf", "TH-Srisakdi-Regular.ttf", "TlwgTypo-Medium.ttf", "NotoSerifThai-Regular.ttf", "TH-Kodchasal-Regular.ttf", "JS-Wansika-Italic.ttf", "JS-Wanida-Italic.ttf", "Trirong-Regular.ttf"], "chars": ["\u0e10\u0e35\u0e49\u0e38", "\u0e23\u0e49\u0e39", "\u0e21\u0e34\u0e4b\u0e3a", "\u0e2a\u0e37\u0e4a\u0e3a", "\u0e14\u0e33\u0e48\u0e39", "\u0e07\u0e31\u0e47\u0e3a", "\u0e20\u0e4e", "\u0e07\u0e31\u0e48", "\u0e04\u0e4a\u0e3a", "\u0e08\u0e33\u0e49", "\u0e16\u0e36\u0e47\u0e3a", "\u0e12\u0e4b", "\u0e28\u0e4e\u0e3a", "\u0e20\u0e37\u0e49\u0e3a", "\u0e22\u0e35\u0e4a\u0e3a", "\u0e13\u0e37\u0e3a", "\u0e21\u0e35\u0e48", "\u0e2e\u0e35\u0e4d\u0e3a", "\u0e08\u0e36\u0e47", "\u0e2e\u0e35\u0e47", "\u0e17\u0e4c\u0e3a", "\u0e02\u0e37\u0e47\u0e3a", "\u0e08\u0e35\u0e49\u0e3a", "\u0e2b\u0e36\u0e4c\u0e3a", "\u0e08\u0e34\u0e4d", "\u0e11\u0e36\u0e4e", "\u0e02\u0e34\u0e4e\u0e3a", "\u0e15\u0e33\u0e4d", "\u0e0a\u0e34\u0e4d", "\u0e2a\u0e34\u0e4d\u0e38", "\u0e2b\u0e31\u0e47\u0e3a", "\u0e28\u0e36\u0e4a", "\u0e01\u0e31\u0e4d\u0e39", "\u0e20\u0e3a", "\u0e07\u0e4d\u0e38", "\u0e01\u0e4b\u0e38", "\u0e01\u0e36\u0e48", "\u0e10\u0e4a", "\u0e2c\u0e36\u0e4c\u0e39", "\u0e29\u0e35\u0e4a", "\u0e12\u0e36\u0e39", "\u0e2b\u0e4d\u0e39", "\u0e23\u0e33\u0e4b\u0e3a", "\u0e2e\u0e31\u0e4a", "\u0e06\u0e4e\u0e38", "\u0e22\u0e35\u0e48\u0e39", "\u0e06\u0e31\u0e48\u0e39", "\u0e15\u0e33\u0e49\u0e39", "\u0e2d\u0e35\u0e4e\u0e38", "\u0e02\u0e37\u0e4b\u0e39", "\u0e13\u0e36\u0e4b\u0e3a", "\u0e2d\u0e33\u0e4d\u0e39", "\u0e08\u0e37\u0e47\u0e38", "\u0e2a\u0e31", "\u0e0f\u0e33\u0e48", "\u0e10\u0e33\u0e4d\u0e39", "\u0e06\u0e34\u0e48", "\u0e03\u0e33\u0e47\u0e3a", "\u0e2c\u0e33\u0e4e\u0e3a", "\u0e1a\u0e31\u0e4b\u0e38", "\u0e10\u0e38", "\u0e21\u0e37\u0e39", "\u0e10\u0e37\u0e4c\u0e3a", "\u0e08\u0e37\u0e4e\u0e3a", "\u0e19\u0e33\u0e48\u0e39", "\u0e03\u0e35\u0e48\u0e38", "\u0e14\u0e35\u0e47", "\u0e1a\u0e37\u0e47\u0e39", "\u0e2c\u0e34\u0e38", "\u0e0b\u0e31\u0e4e\u0e39", "\u0e25\u0e31\u0e3a", "\u0e14\u0e34\u0e49\u0e3a", "\u0e18\u0e37\u0e48\u0e39", "\u0e2d\u0e35", "\u0e15\u0e31\u0e4e\u0e3a", "\u0e01\u0e38", "\u0e0e\u0e48\u0e3a", "\u0e2d\u0e37\u0e4d\u0e38", "\u0e15\u0e33\u0e4d\u0e3a", "\u0e0a\u0e36\u0e4a\u0e3a", "\u0e02\u0e31\u0e49\u0e3a", "\u0e22\u0e33\u0e47\u0e39", "\u0e2e\u0e33\u0e4e\u0e39", "\u0e16\u0e34\u0e4a\u0e38", "\u0e15\u0e37\u0e4d\u0e38", "\u0e02\u0e35\u0e4e\u0e3a", "\u0e19\u0e35\u0e47\u0e3a", "\u0e28\u0e31\u0e49", "\u0e19\u0e31\u0e4d", "\u0e0a\u0e33\u0e4b\u0e3a", "\u0e1a\u0e33\u0e47\u0e38", "\u0e21\u0e36", "\u0e1c\u0e34\u0e47\u0e3a", "\u0e0d\u0e34\u0e4d\u0e39", "\u0e0d\u0e33\u0e4d", "\u0e29\u0e34\u0e49\u0e3a", "\u0e01\u0e4d", "\u0e08\u0e4d\u0e39", "\u0e0b\u0e31\u0e49", "\u0e14\u0e35\u0e4b\u0e3a", "\u0e11\u0e33\u0e4e\u0e39", "\u0e0a\u0e36\u0e49\u0e38", "\u0e1f\u0e34\u0e4c\u0e39", "\u0e15\u0e34\u0e49", "\u0e13\u0e34\u0e4b\u0e39", "\u0e20\u0e34\u0e49\u0e38", "\u0e1c\u0e36\u0e39", "\u0e18\u0e33\u0e48\u0e39", "\u0e1d\u0e31\u0e4b", "\u0e1e\u0e34\u0e4b", "\u0e18\u0e49\u0e39", "\u0e15\u0e31\u0e4e\u0e38", "\u0e11\u0e31\u0e49\u0e39", "\u0e0e\u0e4e\u0e3a", "\u0e07\u0e37\u0e48", "\u0e0e\u0e35\u0e3a", "\u0e0c\u0e4e\u0e3a", "\u0e18\u0e36\u0e4b", "\u0e09\u0e35\u0e4b\u0e38", "\u0e1e\u0e39", "\u0e2e\u0e35\u0e4c", "\u0e0b\u0e35\u0e39", "\u0e0b\u0e34\u0e4b\u0e39", "\u0e28\u0e4d\u0e39", "\u0e1a\u0e33", "\u0e1a\u0e37\u0e4e", "\u0e21\u0e34\u0e4b\u0e39", "\u0e28\u0e33\u0e4e\u0e39", "\u0e0f\u0e33\u0e4d\u0e3a", "\u0e1b\u0e36\u0e4c\u0e38", "\u0e20\u0e35\u0e47\u0e3a", "\u0e27\u0e31\u0e4a", "\u0e0f\u0e33\u0e4c\u0e38", "\u0e07\u0e33\u0e4d", "\u0e08\u0e36\u0e48\u0e38", "\u0e22\u0e31\u0e47\u0e38", "\u0e19\u0e34\u0e4a\u0e38", "\u0e2a\u0e31\u0e4e\u0e39", "\u0e0b\u0e34\u0e49", "\u0e06\u0e35\u0e47", "\u0e0b\u0e31\u0e49\u0e38", "\u0e02\u0e35\u0e4c\u0e38", "\u0e10\u0e33\u0e3a", "\u0e28\u0e36\u0e49\u0e38", "\u0e18\u0e34\u0e39", "\u0e05\u0e33\u0e48", "\u0e13\u0e34\u0e4c", "\u0e14\u0e35\u0e4c\u0e39", "\u0e22\u0e33\u0e4a\u0e38", "\u0e21\u0e34\u0e48\u0e39", "\u0e2a\u0e37\u0e4d", "\u0e1f\u0e31\u0e38", "\u0e0f\u0e35\u0e4a", "\u0e01\u0e34\u0e4e\u0e3a", "\u0e2a\u0e49\u0e38", "\u0e22\u0e35\u0e4d", "\u0e12\u0e31\u0e4a\u0e3a", "\u0e12\u0e31\u0e4d", "\u0e10\u0e36\u0e47\u0e38", "\u0e09\u0e34\u0e4c", "\u0e20\u0e31\u0e39", "\u0e12\u0e36\u0e4c", "\u0e23\u0e35\u0e49\u0e38", "\u0e02\u0e4d\u0e38", "\u0e29\u0e36\u0e4c", "\u0e20\u0e37\u0e4d\u0e39", "\u0e0c\u0e33\u0e49\u0e39", "\u0e0f\u0e34\u0e49\u0e39", "\u0e18\u0e37\u0e4d\u0e38", "\u0e2d\u0e34\u0e4e", "\u0e17\u0e33\u0e47", "\u0e2c\u0e37\u0e4c", "\u0e1f\u0e33\u0e4b\u0e39", "\u0e12\u0e33\u0e4e\u0e3a", "\u0e04\u0e37\u0e3a", "\u0e29\u0e4e\u0e38", "\u0e17\u0e31\u0e4a\u0e38", "\u0e0b\u0e36\u0e4c\u0e38", "\u0e08\u0e35\u0e4d\u0e39", "\u0e20\u0e31\u0e38", "\u0e22\u0e34\u0e4a\u0e38", "\u0e21\u0e37\u0e38", "\u0e01\u0e4b", "\u0e16\u0e37\u0e4a\u0e38", "\u0e2c\u0e35\u0e48\u0e38", "\u0e0e\u0e35\u0e4c\u0e3a", "\u0e1c\u0e4b\u0e3a", "\u0e08\u0e49\u0e39", "\u0e1e\u0e37\u0e4c\u0e38", "\u0e20\u0e37\u0e47\u0e3a", "\u0e1b\u0e34\u0e49\u0e3a", "\u0e2d\u0e35\u0e4d\u0e38", "\u0e01\u0e34\u0e4d", "\u0e06\u0e31\u0e4e\u0e39", "\u0e18\u0e37\u0e4e\u0e38", "\u0e0b\u0e35\u0e4d\u0e3a", "\u0e0a\u0e47", "\u0e0e\u0e35\u0e4e", "\u0e1e\u0e38", "\u0e1d\u0e36\u0e4a\u0e3a", "\u0e2a\u0e36\u0e49\u0e38", "\u0e15\u0e34\u0e4d\u0e39", "\u0e2c\u0e31\u0e38", "\u0e11\u0e31\u0e4c\u0e3a", "\u0e28\u0e37\u0e4d\u0e39", "\u0e03\u0e37\u0e4d\u0e39", "\u0e29\u0e4e", "\u0e0a\u0e4a\u0e39", "\u0e19\u0e37\u0e3a", "\u0e1b\u0e31\u0e47\u0e3a", "\u0e1f\u0e35\u0e4e", "\u0e2d\u0e35\u0e4c\u0e38", "\u0e02\u0e35\u0e47\u0e38", "\u0e05\u0e31\u0e38", "\u0e1b\u0e33\u0e47", "\u0e1e\u0e37\u0e4b", "\u0e28\u0e37\u0e48\u0e38", "\u0e18\u0e34\u0e4b\u0e39", "\u0e17\u0e4b", "\u0e28\u0e34\u0e4a\u0e39", "\u0e2b\u0e34\u0e4d\u0e3a", "\u0e05\u0e37\u0e4d\u0e39", "\u0e19\u0e33\u0e4e\u0e3a", "\u0e12\u0e34\u0e4d\u0e39", "\u0e28\u0e4d\u0e38", "\u0e2d\u0e34\u0e4d\u0e38", "\u0e29\u0e37", "\u0e09\u0e35\u0e4b\u0e3a", "\u0e20\u0e35\u0e4e", "\u0e2a\u0e34\u0e4c\u0e3a", "\u0e07\u0e31", "\u0e04\u0e36\u0e4d", "\u0e05\u0e34\u0e4a", "\u0e17\u0e33\u0e4d\u0e39", "\u0e2a\u0e31\u0e4a\u0e39", "\u0e07\u0e35\u0e48", "\u0e0a\u0e35\u0e4e\u0e38", "\u0e0a\u0e34\u0e4a\u0e39", "\u0e1c\u0e31\u0e4a", "\u0e08\u0e36\u0e4c\u0e39", "\u0e1b\u0e31\u0e47\u0e39", "\u0e1d\u0e34\u0e4d\u0e3a", "\u0e16\u0e37\u0e48\u0e3a", "\u0e29\u0e36\u0e4e", "\u0e25\u0e37\u0e4c\u0e38", "\u0e09\u0e37\u0e49\u0e38", "\u0e28\u0e37\u0e4b\u0e3a", "\u0e11\u0e4c\u0e39", "\u0e01\u0e36\u0e4c\u0e38", "\u0e02\u0e35\u0e4b", "\u0e12\u0e37\u0e4a\u0e38", "\u0e2b\u0e31\u0e48\u0e38", "\u0e18\u0e31\u0e39", "\u0e0d\u0e31\u0e4b\u0e39", "\u0e1f\u0e34\u0e48\u0e39", "\u0e18\u0e33\u0e4e\u0e3a", "\u0e09\u0e37\u0e4b\u0e38", "\u0e0e\u0e35\u0e48", "\u0e21\u0e31\u0e4b", "\u0e27\u0e31\u0e4a\u0e39", "\u0e0e\u0e36\u0e4a\u0e39", "\u0e28\u0e34\u0e48\u0e39", "\u0e23\u0e36\u0e48", "\u0e1e\u0e37\u0e4a", "\u0e06\u0e34", "\u0e09\u0e36\u0e49\u0e3a", "\u0e06\u0e35\u0e4c\u0e38", "\u0e0e\u0e36\u0e48", "\u0e18\u0e31\u0e47\u0e3a", "\u0e06\u0e33\u0e47", "\u0e1a\u0e36\u0e38", "\u0e29\u0e4c\u0e3a", "\u0e1c\u0e31\u0e4a\u0e38", "\u0e1a\u0e35\u0e47", "\u0e0c\u0e35\u0e4b\u0e38", "\u0e02\u0e4d\u0e39", "\u0e2d\u0e35\u0e4b\u0e3a", "\u0e16\u0e4a\u0e3a", "\u0e16\u0e33\u0e4d\u0e39", "\u0e29\u0e31\u0e4d", "\u0e11\u0e47\u0e38", "\u0e0b\u0e4e\u0e39", "\u0e01\u0e36\u0e4b\u0e38", "\u0e0a\u0e33\u0e4c\u0e39", "\u0e1c\u0e4b\u0e38", "\u0e10\u0e37", "\u0e28\u0e48\u0e3a", "\u0e10\u0e35\u0e47", "\u0e28\u0e4c\u0e3a", "\u0e0a\u0e35\u0e4c\u0e38", "\u0e03\u0e4a\u0e38", "\u0e2e\u0e34\u0e4e", "\u0e12\u0e31\u0e4e\u0e38", "\u0e23\u0e35\u0e48", "\u0e1e\u0e35\u0e4c", "\u0e1f\u0e35\u0e4c", "\u0e1c\u0e31\u0e48", "\u0e22\u0e4b\u0e39", "\u0e12\u0e37\u0e4c", "\u0e0d\u0e33\u0e48\u0e3a", "\u0e18\u0e48\u0e38", "\u0e1a\u0e35\u0e4e\u0e38", "\u0e06\u0e33\u0e4c\u0e38", "\u0e23\u0e33\u0e48", "\u0e0f\u0e31\u0e4c\u0e38", "\u0e07\u0e31\u0e4c", "\u0e1a\u0e33\u0e48", "\u0e01\u0e34\u0e4b\u0e3a", "\u0e19\u0e35\u0e4d\u0e39", "\u0e17\u0e4e\u0e38", "\u0e2b\u0e4e\u0e39", "\u0e1c\u0e37\u0e48\u0e39", "\u0e05\u0e34\u0e48\u0e39", "\u0e22\u0e34\u0e4c", "\u0e1d\u0e33\u0e49\u0e39", "\u0e13\u0e33\u0e4b\u0e3a", "\u0e17\u0e37\u0e47\u0e39", "\u0e0e\u0e37\u0e4a\u0e39", "\u0e06\u0e37\u0e4d\u0e38", "\u0e1f\u0e37\u0e4e", "\u0e2d\u0e37\u0e4a\u0e38", "\u0e0d\u0e35\u0e4c\u0e38", "\u0e0f\u0e33\u0e38", "\u0e13\u0e36\u0e48", "\u0e2e\u0e38", "\u0e2c\u0e34\u0e49\u0e39", "\u0e20\u0e33\u0e4c\u0e38", "\u0e0b\u0e31\u0e4c", "\u0e09\u0e34\u0e47", "\u0e13\u0e37\u0e4b\u0e3a", "\u0e2a\u0e36\u0e4c\u0e39", "\u0e08\u0e37\u0e4a\u0e39", "\u0e19\u0e35\u0e47\u0e39", "\u0e0a\u0e31\u0e3a", "\u0e2a\u0e34\u0e49", "\u0e21\u0e34\u0e49\u0e3a", "\u0e17\u0e37\u0e4c", "\u0e05\u0e34\u0e4b\u0e3a", "\u0e2b\u0e35\u0e47", "\u0e0a\u0e37\u0e48", "\u0e1b\u0e31\u0e49\u0e39", "\u0e13\u0e33\u0e3a", "\u0e07\u0e35\u0e48\u0e38", "\u0e1e\u0e36\u0e47\u0e3a", "\u0e20\u0e34\u0e4e\u0e39", "\u0e2e\u0e34\u0e4b\u0e3a", "\u0e10\u0e48\u0e38", "\u0e17\u0e31\u0e4e\u0e39", "\u0e0a\u0e37\u0e49\u0e38", "\u0e10\u0e34\u0e48\u0e38", "\u0e18\u0e35\u0e4a", "\u0e1c\u0e35\u0e49\u0e3a", "\u0e20\u0e36\u0e4c\u0e39", "\u0e09\u0e35\u0e4e\u0e39", "\u0e1f\u0e33", "\u0e0d\u0e36\u0e47\u0e38", "\u0e27\u0e34\u0e47", "\u0e0d\u0e33\u0e4d\u0e39", "\u0e04\u0e37\u0e4e", "\u0e02\u0e37\u0e4c\u0e39", "\u0e27\u0e35\u0e4d", "\u0e20\u0e33\u0e4d", "\u0e2d\u0e31\u0e47\u0e38", "\u0e20\u0e36\u0e48\u0e38", "\u0e21\u0e35\u0e4e", "\u0e04\u0e31\u0e4c\u0e38", "\u0e2c\u0e33\u0e38", "\u0e29\u0e34\u0e48", "\u0e0f\u0e37\u0e4a\u0e39", "\u0e09\u0e36\u0e47\u0e38", "\u0e09\u0e33\u0e38", "\u0e08\u0e31\u0e4c", "\u0e1a\u0e33\u0e4c\u0e3a", "\u0e2c\u0e35\u0e47\u0e38", "\u0e27\u0e35\u0e4e", "\u0e18\u0e34\u0e48\u0e3a", "\u0e05\u0e35\u0e4e\u0e38", "\u0e12\u0e35\u0e47", "\u0e03\u0e31\u0e48\u0e3a", "\u0e0d\u0e35\u0e47\u0e38", "\u0e1a\u0e33\u0e4b\u0e38", "\u0e02\u0e31\u0e48\u0e3a", "\u0e2b\u0e4a\u0e39", "\u0e1b\u0e35\u0e4b\u0e39", "\u0e0c\u0e35\u0e4a\u0e39", "\u0e21\u0e34\u0e4a\u0e38", "\u0e05\u0e35\u0e49\u0e39", "\u0e21\u0e4d\u0e38", "\u0e01\u0e35\u0e4e\u0e39", "\u0e0b\u0e33\u0e39", "\u0e1c\u0e35\u0e4b\u0e39", "\u0e0f\u0e34\u0e47\u0e3a", "\u0e1c\u0e33\u0e4b\u0e39", "\u0e12\u0e31\u0e49", "\u0e0a\u0e34\u0e4e\u0e38", "\u0e0e\u0e35\u0e4d\u0e3a", "\u0e1f\u0e31\u0e49", "\u0e1e\u0e31\u0e4b\u0e38", "\u0e06\u0e31\u0e47\u0e38", "\u0e11\u0e35\u0e4d\u0e39", "\u0e03\u0e31\u0e4a", "\u0e0e\u0e31\u0e47\u0e3a", "\u0e11\u0e31\u0e4d\u0e39", "\u0e25\u0e34\u0e47\u0e39", "\u0e28\u0e33\u0e4b\u0e3a", "\u0e2c\u0e36\u0e4d\u0e38", "\u0e03\u0e36\u0e48\u0e38", "\u0e15\u0e31\u0e48\u0e3a", "\u0e2e\u0e34\u0e47\u0e3a", "\u0e28\u0e31\u0e4e", "\u0e1d\u0e47", "\u0e2e\u0e36\u0e4d\u0e39", "\u0e1f\u0e37\u0e38", "\u0e0e\u0e31\u0e49\u0e38", "\u0e03\u0e34\u0e49\u0e38", "\u0e1d\u0e35\u0e4a\u0e3a", "\u0e0e\u0e37\u0e49\u0e38", "\u0e07\u0e33\u0e4b\u0e38", "\u0e17\u0e35\u0e4d", "\u0e0b\u0e31\u0e4a", "\u0e01\u0e4a\u0e3a", "\u0e25\u0e4d", "\u0e03\u0e34\u0e39", "\u0e14\u0e35\u0e4d\u0e3a", "\u0e20\u0e34\u0e48\u0e39", "\u0e27\u0e35\u0e4c\u0e39", "\u0e01\u0e37\u0e4a\u0e38", "\u0e05\u0e36\u0e4b\u0e39", "\u0e14\u0e33\u0e48", "\u0e16\u0e33\u0e49\u0e3a", "\u0e2e\u0e37\u0e4d\u0e38", "\u0e1b\u0e34", "\u0e0c\u0e33\u0e48\u0e3a", "\u0e01\u0e36\u0e39", "\u0e28\u0e35\u0e48\u0e39", "\u0e27\u0e36\u0e47", "\u0e08\u0e37\u0e49\u0e39", "\u0e06\u0e35\u0e49\u0e38", "\u0e12\u0e4a", "\u0e12\u0e35\u0e4e\u0e3a", "\u0e07\u0e4b\u0e38", "\u0e2c\u0e4d", "\u0e0e\u0e33\u0e4c\u0e3a", "\u0e10\u0e35\u0e4d", "\u0e29\u0e37\u0e3a", "\u0e0d\u0e4a\u0e39", "\u0e0a\u0e31\u0e4a", "\u0e16\u0e36\u0e4a\u0e39", "\u0e1f\u0e36", "\u0e13\u0e31\u0e4b", "\u0e17\u0e37\u0e4d\u0e3a", "\u0e15\u0e36\u0e4e\u0e3a", "\u0e19\u0e36\u0e4a\u0e38", "\u0e22\u0e34\u0e49", "\u0e27\u0e36\u0e4c\u0e3a", "\u0e0a\u0e35\u0e48\u0e3a", "\u0e09\u0e36\u0e49", "\u0e1d\u0e37\u0e4a\u0e39", "\u0e1e\u0e33\u0e4d\u0e39", "\u0e11\u0e37\u0e4c\u0e38", "\u0e08\u0e4a", "\u0e21\u0e35", "\u0e0e\u0e37\u0e39", "\u0e18\u0e35\u0e4a\u0e3a", "\u0e2d\u0e35\u0e48\u0e38", "\u0e14\u0e37\u0e4e\u0e38", "\u0e15\u0e4e\u0e3a", "\u0e1a\u0e34\u0e4e", "\u0e20\u0e35\u0e4c\u0e38", "\u0e25\u0e34\u0e4a\u0e39", "\u0e25\u0e49\u0e3a", "\u0e13\u0e31\u0e49\u0e38", "\u0e0d\u0e33\u0e49\u0e3a", "\u0e1a\u0e35\u0e4a\u0e39", "\u0e12\u0e36\u0e49\u0e3a", "\u0e22\u0e35\u0e49\u0e38", "\u0e22\u0e36\u0e4a\u0e3a", "\u0e09\u0e34\u0e3a", "\u0e10\u0e4b\u0e3a", "\u0e23", "\u0e14\u0e36\u0e48\u0e39", "\u0e29\u0e34\u0e4b\u0e3a", "\u0e0b\u0e35\u0e47", "\u0e15\u0e36\u0e4e\u0e39", "\u0e25\u0e37\u0e4d\u0e39", "\u0e10\u0e31\u0e4d\u0e3a", "\u0e27\u0e35\u0e49", "\u0e13\u0e4e\u0e38", "\u0e2a\u0e4b\u0e39", "\u0e2c\u0e48\u0e38", "\u0e22\u0e35\u0e4e\u0e38", "\u0e10\u0e36\u0e4e\u0e39", "\u0e19\u0e37\u0e4a\u0e39", "\u0e05\u0e4d\u0e39", "\u0e2d\u0e31", "\u0e25\u0e37\u0e4d", "\u0e1f\u0e31\u0e4c\u0e3a", "\u0e2a\u0e4b\u0e3a", "\u0e18\u0e34\u0e4d\u0e39", "\u0e1f\u0e31\u0e3a", "\u0e1f\u0e33\u0e4e", "\u0e2e\u0e36\u0e4d\u0e3a", "\u0e28\u0e31\u0e4a\u0e38", "\u0e20\u0e4b\u0e3a", "\u0e2e\u0e36", "\u0e2a\u0e33\u0e4d", "\u0e10\u0e31\u0e4a\u0e3a", "\u0e2e\u0e31\u0e38", "\u0e15\u0e34\u0e4b", "\u0e03\u0e4c", "\u0e2e\u0e34\u0e4c\u0e3a", "\u0e1e\u0e37", "\u0e01\u0e33\u0e47\u0e38", "\u0e0b\u0e33\u0e47\u0e3a", "\u0e0b\u0e35\u0e4e\u0e3a", "\u0e23\u0e37\u0e4c\u0e3a", "\u0e2b\u0e35\u0e4d\u0e3a", "\u0e0e\u0e34\u0e4e\u0e3a", "\u0e19\u0e37\u0e47\u0e39", "\u0e14\u0e35\u0e47\u0e38", "\u0e1f\u0e36\u0e47\u0e38", "\u0e14\u0e34\u0e48\u0e38", "\u0e2c\u0e37\u0e4c\u0e39", "\u0e11\u0e35\u0e4e\u0e38", "\u0e13\u0e36\u0e48\u0e39", "\u0e21\u0e4e\u0e3a", "\u0e14\u0e37", "\u0e16\u0e48\u0e38", "\u0e2c\u0e31\u0e4b\u0e39", "\u0e21\u0e37\u0e48\u0e39", "\u0e1c\u0e31\u0e4b", "\u0e25\u0e35\u0e47\u0e39", "\u0e1e\u0e34\u0e4c\u0e3a", "\u0e1e\u0e36\u0e4e", "\u0e19\u0e34\u0e4a", "\u0e10\u0e36\u0e4d\u0e39", "\u0e27\u0e33\u0e4e\u0e3a", "\u0e22\u0e33\u0e38", "\u0e0a\u0e33\u0e4c\u0e3a", "\u0e25\u0e34\u0e47\u0e3a", "\u0e1e\u0e35\u0e3a", "\u0e2c\u0e31\u0e4b", "\u0e23\u0e36\u0e4a", "\u0e08\u0e34\u0e4b\u0e39", "\u0e1a\u0e35\u0e4e\u0e3a", "\u0e07\u0e35\u0e4a\u0e3a", "\u0e19\u0e37\u0e4c\u0e38", "\u0e09\u0e35\u0e48\u0e3a", "\u0e20\u0e36\u0e3a", "\u0e0d\u0e31\u0e4b\u0e38", "\u0e1f\u0e31\u0e48", "\u0e2c\u0e36\u0e4b\u0e3a", "\u0e22\u0e37\u0e4e\u0e38", "\u0e0f\u0e36\u0e38", "\u0e09\u0e34\u0e48", "\u0e2a\u0e35\u0e49\u0e39", "\u0e0c\u0e35\u0e39", "\u0e2b\u0e4b\u0e3a", "\u0e10\u0e34\u0e4e", "\u0e17\u0e35\u0e39", "\u0e04\u0e34\u0e4b\u0e39", "\u0e29\u0e4c", "\u0e27\u0e34\u0e49\u0e38", "\u0e2a\u0e35\u0e47\u0e3a", "\u0e09\u0e35\u0e38", "\u0e20\u0e34\u0e3a", "\u0e12\u0e4e", "\u0e06\u0e33\u0e49\u0e39", "\u0e10\u0e37\u0e48\u0e39", "\u0e18\u0e34\u0e47\u0e39", "\u0e08\u0e4d", "\u0e0f\u0e48", "\u0e21\u0e34\u0e39", "\u0e29\u0e36\u0e47\u0e38", "\u0e12\u0e33\u0e47\u0e39", "\u0e0d\u0e49\u0e39", "\u0e0c\u0e31\u0e48\u0e38", "\u0e2b\u0e31\u0e49", "\u0e0d\u0e35\u0e47\u0e39", "\u0e28\u0e35\u0e4a\u0e39", "\u0e1f\u0e33\u0e3a", "\u0e05\u0e37\u0e4a\u0e38", "\u0e16\u0e35\u0e4a", "\u0e1c\u0e4a\u0e39", "\u0e13\u0e37\u0e4d\u0e38", "\u0e1a\u0e34\u0e4d\u0e3a", "\u0e1b\u0e31\u0e4c\u0e39", "\u0e0e\u0e36\u0e4e\u0e3a", "\u0e2b\u0e37\u0e4b\u0e39", "\u0e0c\u0e4c", "\u0e11\u0e34\u0e4d\u0e38", "\u0e27\u0e49\u0e39", "\u0e04\u0e33\u0e4c", "\u0e1d\u0e34\u0e48\u0e3a", "\u0e0f\u0e34\u0e4e", "\u0e0d\u0e35\u0e49\u0e3a", "\u0e0d\u0e37\u0e4d\u0e39", "\u0e14\u0e4c\u0e3a", "\u0e14\u0e36\u0e4b\u0e39", "\u0e15\u0e37\u0e4c\u0e39", "\u0e0d\u0e35\u0e49\u0e38", "\u0e19\u0e36\u0e4d\u0e39", "\u0e12\u0e31\u0e4b", "\u0e17\u0e33\u0e49\u0e38", "\u0e0f\u0e37\u0e4b", "\u0e29\u0e36\u0e4c\u0e3a", "\u0e14\u0e47\u0e3a", "\u0e20\u0e36\u0e4b\u0e39", "\u0e27\u0e49\u0e3a", "\u0e1c\u0e33\u0e38", "\u0e06\u0e36\u0e4d\u0e3a", "\u0e25\u0e34\u0e4e\u0e38", "\u0e12\u0e37\u0e47\u0e38", "\u0e03\u0e36\u0e4a\u0e38", "\u0e2c\u0e4b\u0e3a", "\u0e15\u0e31\u0e4b", "\u0e16\u0e34\u0e48\u0e3a", "\u0e08\u0e34\u0e4c", "\u0e04\u0e4d\u0e3a", "\u0e1f\u0e33\u0e48\u0e39", "\u0e06\u0e34\u0e4b\u0e3a", "\u0e0d\u0e37\u0e4a", "\u0e0e\u0e36\u0e4c\u0e38", "\u0e2e\u0e34\u0e48\u0e38", "\u0e12\u0e39", "\u0e16\u0e33\u0e4a\u0e39", "\u0e25\u0e37\u0e4e\u0e39", "\u0e06\u0e37\u0e4e\u0e38", "\u0e2b\u0e31\u0e48", "\u0e06\u0e31\u0e4a", "\u0e13\u0e31\u0e47", "\u0e28\u0e34\u0e4e", "\u0e1f\u0e4e", "\u0e1d\u0e33\u0e4c", "\u0e15\u0e34\u0e47", "\u0e0c\u0e48\u0e3a", "\u0e0b\u0e37\u0e49\u0e3a", "\u0e0b\u0e31\u0e48\u0e3a", "\u0e19\u0e31\u0e4b\u0e38", "\u0e1f\u0e31\u0e49\u0e38", "\u0e1c\u0e36\u0e48\u0e38", "\u0e21\u0e31\u0e4b\u0e3a", "\u0e16\u0e31\u0e49\u0e39", "\u0e1e\u0e36\u0e49", "\u0e0b\u0e34\u0e48\u0e39", "\u0e0b\u0e49\u0e38", "\u0e12\u0e4e\u0e3a", "\u0e13\u0e39", "\u0e1f\u0e34\u0e49\u0e3a", "\u0e2b\u0e34\u0e4e", "\u0e2b\u0e33\u0e4d\u0e3a", "\u0e05\u0e37\u0e47\u0e3a", "\u0e2b\u0e36\u0e4d\u0e3a", "\u0e29\u0e47\u0e39", "\u0e17\u0e37\u0e49\u0e3a", "\u0e2d\u0e33\u0e4d\u0e38", "\u0e1d\u0e37\u0e4e\u0e3a", "\u0e1a\u0e34\u0e4c\u0e39", "\u0e08\u0e36\u0e47\u0e38", "\u0e1f\u0e4a\u0e38", "\u0e27\u0e4a", "\u0e20\u0e33\u0e48\u0e38", "\u0e12\u0e33\u0e39", "\u0e1a\u0e35\u0e4d\u0e38", "\u0e05\u0e37\u0e4e\u0e39", "\u0e1c\u0e4c\u0e39", "\u0e15\u0e33\u0e4e\u0e3a", "\u0e27\u0e31\u0e4c\u0e3a", "\u0e27\u0e33\u0e4e\u0e38", "\u0e15\u0e31\u0e4b\u0e3a", "\u0e2e\u0e34\u0e4a\u0e38", "\u0e11\u0e34\u0e38", "\u0e04\u0e31", "\u0e1c\u0e34\u0e4d\u0e38", "\u0e10\u0e35\u0e4b\u0e39", "\u0e19\u0e34\u0e4b", "\u0e0f\u0e34", "\u0e1a\u0e4a\u0e3a", "\u0e20\u0e33\u0e38", "\u0e22\u0e36\u0e4c\u0e3a", "\u0e0d\u0e33\u0e38", "\u0e0c\u0e31\u0e4b\u0e3a", "\u0e14\u0e31\u0e4c\u0e3a", "\u0e1d\u0e33\u0e4d\u0e3a", "\u0e02\u0e31\u0e47", "\u0e07\u0e35\u0e39", "\u0e2b\u0e36\u0e4d\u0e39", "\u0e10\u0e31\u0e4a", "\u0e04\u0e35\u0e4c\u0e39", "\u0e29\u0e36\u0e3a", "\u0e05\u0e31\u0e39", "\u0e13\u0e49\u0e3a", "\u0e04\u0e34\u0e48\u0e38", "\u0e20\u0e37\u0e47\u0e39", "\u0e1e\u0e47\u0e3a", "\u0e2a\u0e34\u0e38", "\u0e09\u0e4c\u0e38", "\u0e06\u0e33\u0e47\u0e39", "\u0e15\u0e33\u0e4d\u0e39", "\u0e1b\u0e36\u0e47\u0e3a", "\u0e29\u0e31\u0e49\u0e39", "\u0e02\u0e49\u0e3a", "\u0e09\u0e36\u0e4b\u0e3a", "\u0e0c\u0e36\u0e47\u0e38", "\u0e08\u0e36\u0e4a\u0e3a", "\u0e0a\u0e34\u0e47\u0e39", "\u0e0c\u0e34\u0e48\u0e38", "\u0e0b\u0e34\u0e3a", "\u0e1e\u0e31\u0e4c\u0e3a", "\u0e12\u0e34\u0e4a", "\u0e1a\u0e37\u0e4e\u0e38", "\u0e10\u0e36\u0e38", "\u0e13\u0e34\u0e4d", "\u0e15\u0e35\u0e4c\u0e39", "\u0e20\u0e34\u0e4a\u0e3a", "\u0e2b\u0e36\u0e48\u0e3a", "\u0e05\u0e31\u0e4d\u0e3a", "\u0e1b\u0e33", "\u0e2e\u0e49\u0e39", "\u0e10\u0e35\u0e4a\u0e38", "\u0e1c\u0e35\u0e4e", "\u0e07\u0e36\u0e49\u0e38", "\u0e07\u0e4b", "\u0e03\u0e34\u0e4e\u0e38", "\u0e21\u0e33\u0e4b\u0e39", "\u0e04\u0e4c\u0e3a", "\u0e29\u0e33\u0e48", "\u0e1a\u0e4a\u0e39", "\u0e0c\u0e37\u0e4e\u0e39", "\u0e06\u0e36\u0e49\u0e3a", "\u0e09\u0e33\u0e4d\u0e39", "\u0e27\u0e35\u0e4b\u0e38", "\u0e13\u0e31\u0e38", "\u0e28\u0e33\u0e48\u0e38", "\u0e2d\u0e35\u0e4c\u0e39", "\u0e05\u0e36\u0e4d\u0e38", "\u0e03\u0e37\u0e4b\u0e38", "\u0e02\u0e33\u0e4e\u0e38", "\u0e0a\u0e31\u0e47\u0e39", "\u0e2a\u0e34\u0e3a", "\u0e28\u0e48\u0e38", "\u0e29\u0e34\u0e4d", "\u0e16\u0e37\u0e4d\u0e3a", "\u0e29\u0e35\u0e4a\u0e3a", "\u0e01\u0e31\u0e39", "\u0e23\u0e33\u0e4d\u0e3a", "\u0e2a\u0e31\u0e49\u0e39", "\u0e18\u0e4c\u0e39", "\u0e0c\u0e35\u0e48\u0e38", "\u0e23\u0e37\u0e4e\u0e38", "\u0e19\u0e34\u0e49", "\u0e20\u0e35\u0e4d\u0e38", "\u0e0d\u0e35\u0e48", "\u0e20\u0e39", "\u0e18\u0e4c\u0e3a", "\u0e20\u0e35\u0e47\u0e38", "\u0e0e\u0e31\u0e4c", "\u0e1d\u0e36\u0e4b", "\u0e09\u0e4d\u0e38", "\u0e05\u0e35\u0e47\u0e3a", "\u0e06\u0e48\u0e39", "\u0e29\u0e36\u0e47\u0e3a", "\u0e1b\u0e35\u0e47\u0e38", "\u0e16\u0e35\u0e4b\u0e3a", "\u0e0e\u0e37\u0e38", "\u0e27\u0e36", "\u0e1a\u0e31\u0e49\u0e38", "\u0e06\u0e36\u0e48\u0e3a", "\u0e03\u0e35\u0e48", "\u0e2a\u0e34\u0e4d\u0e3a", "\u0e0a\u0e37\u0e49\u0e3a", "\u0e1d\u0e4b\u0e38", "\u0e02\u0e31\u0e4d\u0e39", "\u0e20\u0e31\u0e48\u0e3a", "\u0e1a\u0e35\u0e47\u0e3a", "\u0e17\u0e48\u0e3a", "\u0e13\u0e48\u0e38", "\u0e08\u0e4a\u0e3a", "\u0e0e\u0e4a", "\u0e1b\u0e36\u0e4b\u0e3a", "\u0e19\u0e37\u0e4c", "\u0e20\u0e34\u0e47", "\u0e14\u0e36\u0e4c\u0e39", "\u0e0d\u0e31\u0e48\u0e39", "\u0e2c\u0e33\u0e49\u0e38", "\u0e1f\u0e35\u0e47\u0e39", "\u0e0e\u0e35", "\u0e29\u0e47\u0e38", "\u0e0e\u0e34\u0e4d\u0e39", "\u0e12\u0e4b\u0e3a", "\u0e20\u0e35\u0e4c\u0e3a", "\u0e19\u0e35\u0e4d\u0e38", "\u0e2a\u0e37\u0e3a", "\u0e14\u0e33\u0e4e", "\u0e28\u0e34\u0e4c\u0e3a", "\u0e03\u0e35\u0e4b\u0e3a", "\u0e18\u0e37\u0e4a\u0e3a", "\u0e21\u0e36\u0e47", "\u0e28\u0e4c\u0e39", "\u0e2a\u0e31\u0e48\u0e39", "\u0e03\u0e31\u0e4c\u0e39", "\u0e05\u0e34\u0e4d", "\u0e04\u0e35\u0e4b\u0e38", "\u0e02\u0e37\u0e4e", "\u0e12\u0e35\u0e4a", "\u0e01\u0e31\u0e4e", "\u0e22\u0e35\u0e4c\u0e3a", "\u0e0c\u0e35\u0e47", "\u0e1d\u0e31\u0e4c\u0e3a", "\u0e13\u0e33\u0e4b\u0e39", "\u0e1b\u0e35\u0e4c\u0e38", "\u0e0f\u0e33\u0e49\u0e39", "\u0e2d\u0e36", "\u0e13\u0e4b", "\u0e14\u0e37\u0e47\u0e38", "\u0e19\u0e35\u0e4c\u0e3a", "\u0e2c\u0e37\u0e4b\u0e39", "\u0e18\u0e36\u0e39", "\u0e10\u0e36\u0e47\u0e39", "\u0e0a\u0e37\u0e3a", "\u0e15\u0e4c", "\u0e15\u0e31\u0e4d\u0e3a", "\u0e0a\u0e4d\u0e38", "\u0e11\u0e31\u0e47\u0e38", "\u0e2a\u0e33\u0e47\u0e39", "\u0e2d\u0e35\u0e48", "\u0e0f\u0e33\u0e49\u0e38", "\u0e0e\u0e4e", "\u0e2c\u0e34\u0e4d\u0e39", "\u0e14\u0e34\u0e4b\u0e39", "\u0e03\u0e37\u0e4d\u0e38", "\u0e28\u0e34\u0e4e\u0e3a", "\u0e27\u0e31\u0e47\u0e39", "\u0e0a\u0e33\u0e4b\u0e39", "\u0e11\u0e37\u0e4b", "\u0e13\u0e34\u0e4b\u0e38", "\u0e03\u0e49\u0e38", "\u0e2e\u0e37\u0e4c\u0e38", "\u0e05\u0e34\u0e4b\u0e38", "\u0e25\u0e35\u0e48\u0e39", "\u0e13\u0e35\u0e48\u0e38", "\u0e27\u0e37\u0e4e\u0e38", "\u0e11\u0e31\u0e48\u0e38", "\u0e16\u0e33\u0e4a\u0e38", "\u0e1c\u0e49", "\u0e04\u0e33\u0e4b\u0e38", "\u0e17\u0e35\u0e4d\u0e3a", "\u0e15\u0e34\u0e4c\u0e39", "\u0e0a\u0e34\u0e4e\u0e3a", "\u0e12\u0e35", "\u0e1a\u0e31\u0e4b\u0e39", "\u0e0d\u0e4d\u0e39", "\u0e2c\u0e36\u0e49", "\u0e1c\u0e4c", "\u0e2c\u0e33\u0e4a", "\u0e17\u0e35\u0e4c\u0e39", "\u0e01\u0e34\u0e3a", "\u0e1c\u0e34\u0e4c", "\u0e11\u0e33\u0e4a\u0e3a", "\u0e08\u0e35\u0e4d", "\u0e02\u0e35\u0e4b\u0e39", "\u0e2b\u0e33\u0e4d", "\u0e15\u0e4a\u0e3a", "\u0e03\u0e37\u0e39", "\u0e1b\u0e34\u0e4b\u0e38", "\u0e2c\u0e37\u0e47\u0e38", "\u0e01\u0e35\u0e47\u0e3a", "\u0e0c\u0e34\u0e4b\u0e38", "\u0e08\u0e34\u0e49\u0e38", "\u0e1a", "\u0e22\u0e33\u0e4d\u0e38", "\u0e18\u0e33\u0e4d\u0e38", "\u0e08\u0e37\u0e4b\u0e3a", "\u0e01\u0e34\u0e4d\u0e39", "\u0e28\u0e35\u0e49", "\u0e05\u0e33\u0e39", "\u0e20\u0e34\u0e4d\u0e38", "\u0e28\u0e34\u0e4b\u0e39", "\u0e02\u0e31\u0e4c\u0e39", "\u0e05\u0e31\u0e4b\u0e39", "\u0e02\u0e35\u0e4a\u0e3a", "\u0e22\u0e37\u0e4d", "\u0e2b\u0e33\u0e4a", "\u0e22\u0e34\u0e47\u0e38", "\u0e2b\u0e38", "\u0e2b\u0e34\u0e48\u0e3a", "\u0e04\u0e35\u0e47\u0e39", "\u0e19\u0e35", "\u0e14\u0e33\u0e4a\u0e38", "\u0e0f\u0e34\u0e39", "\u0e2e\u0e35\u0e48\u0e3a", "\u0e2b\u0e33\u0e4d\u0e39", "\u0e11\u0e33\u0e4d\u0e39", "\u0e22\u0e36\u0e4c\u0e38", "\u0e0e\u0e36\u0e49\u0e3a", "\u0e17\u0e47\u0e3a", "\u0e12\u0e37\u0e4e\u0e3a", "\u0e16\u0e31\u0e4e\u0e38", "\u0e01\u0e37\u0e4c", "\u0e0c\u0e47", "\u0e01\u0e33\u0e4c", "\u0e29\u0e37\u0e4a\u0e39", "\u0e17\u0e35\u0e47", "\u0e27\u0e33\u0e4b\u0e39", "\u0e0c\u0e37\u0e4c", "\u0e1a\u0e34\u0e4a\u0e3a", "\u0e03\u0e4a", "\u0e0d\u0e34\u0e4b\u0e38", "\u0e05\u0e34\u0e4d\u0e3a", "\u0e09\u0e31\u0e49\u0e3a", "\u0e25\u0e31\u0e4d\u0e38", "\u0e2c\u0e35\u0e47\u0e39", "\u0e08\u0e36\u0e3a", "\u0e22\u0e34\u0e48\u0e3a", "\u0e27\u0e35\u0e4e\u0e38", "\u0e15\u0e31\u0e47\u0e38", "\u0e0f\u0e35\u0e4d\u0e39", "\u0e20\u0e35\u0e4a\u0e38", "\u0e27\u0e37\u0e4c\u0e3a", "\u0e11", "\u0e03\u0e34\u0e4b", "\u0e07\u0e37\u0e4e\u0e39", "\u0e1e\u0e37\u0e47", "\u0e03\u0e37\u0e49\u0e39", "\u0e14\u0e35\u0e49\u0e39", "\u0e07\u0e36\u0e4c", "\u0e1c\u0e33\u0e49\u0e39", "\u0e29\u0e31\u0e4e", "\u0e0f\u0e33\u0e4b\u0e39", "\u0e28\u0e35\u0e4d\u0e3a", "\u0e1a\u0e35\u0e4b\u0e39", "\u0e1f\u0e35\u0e4c\u0e39", "\u0e0c\u0e35\u0e3a", "\u0e27\u0e34\u0e4a\u0e39", "\u0e1e\u0e33\u0e48", "\u0e09\u0e36\u0e4b", "\u0e1e\u0e36\u0e4d\u0e39", "\u0e1d\u0e34\u0e4b", "\u0e0c\u0e35\u0e4b\u0e3a", "\u0e20\u0e35\u0e49\u0e39", "\u0e08\u0e31\u0e4e\u0e39", "\u0e2c\u0e48", "\u0e1a\u0e36\u0e4b\u0e3a", "\u0e25\u0e4c\u0e39", "\u0e2a\u0e37\u0e38", "\u0e1b\u0e31\u0e4b\u0e39", "\u0e10\u0e31\u0e4d", "\u0e07\u0e34\u0e4d\u0e3a", "\u0e09\u0e4c", "\u0e14\u0e34\u0e4c", "\u0e14\u0e31\u0e48", "\u0e0f\u0e34\u0e4c\u0e39", "\u0e16\u0e36\u0e48\u0e39", "\u0e0f\u0e37\u0e48\u0e39", "\u0e1e\u0e49\u0e3a", "\u0e28\u0e37\u0e4b\u0e39", "\u0e13\u0e34\u0e4e\u0e3a", "\u0e2b\u0e33\u0e4c", "\u0e0b\u0e33\u0e48\u0e39", "\u0e28\u0e35\u0e48\u0e38", "\u0e0f\u0e35\u0e4a\u0e3a", "\u0e29\u0e37\u0e4a\u0e3a", "\u0e0d\u0e49\u0e38", "\u0e03\u0e36\u0e4e\u0e3a", "\u0e16\u0e35\u0e4a\u0e3a", "\u0e1c\u0e31\u0e3a", "\u0e0a\u0e31\u0e4e", "\u0e02\u0e4a", "\u0e09\u0e37\u0e4c\u0e38", "\u0e0d\u0e36\u0e4b", "\u0e01\u0e4e", "\u0e09\u0e4c\u0e39", "\u0e0c\u0e31\u0e47\u0e39", "\u0e08\u0e31\u0e4a\u0e39", "\u0e01\u0e36\u0e4e\u0e39", "\u0e0b\u0e34\u0e48\u0e38", "\u0e1c\u0e37\u0e4e\u0e38", "\u0e17\u0e48", "\u0e0f\u0e34\u0e47\u0e39", "\u0e19\u0e31\u0e4a", "\u0e0a\u0e33\u0e4b\u0e38", "\u0e23\u0e49\u0e3a", "\u0e10\u0e49\u0e38", "\u0e0b\u0e34\u0e4d", "\u0e22\u0e48\u0e39", "\u0e0f\u0e33\u0e48\u0e39", "\u0e27\u0e35\u0e4a\u0e38", "\u0e20\u0e33\u0e4a\u0e3a", "\u0e25\u0e31\u0e4a\u0e38", "\u0e2d\u0e37\u0e3a", "\u0e14\u0e33\u0e39", "\u0e10\u0e36\u0e49\u0e39", "\u0e16\u0e37\u0e4a", "\u0e08\u0e37\u0e4e\u0e39", "\u0e2e\u0e33\u0e4e", "\u0e08\u0e37\u0e4c", "\u0e0d\u0e31\u0e48", "\u0e17\u0e33\u0e4d\u0e3a", "\u0e29\u0e34\u0e4a\u0e3a", "\u0e1c\u0e36\u0e49\u0e3a", "\u0e28\u0e33\u0e49\u0e39", "\u0e15\u0e4b\u0e3a", "\u0e23\u0e37\u0e48\u0e39", "\u0e29\u0e34\u0e47\u0e3a", "\u0e0f\u0e3a", "\u0e28\u0e35\u0e4d\u0e39", "\u0e03\u0e4d\u0e39", "\u0e1f\u0e38", "\u0e1e\u0e37\u0e49\u0e3a", "\u0e17\u0e36\u0e47\u0e39", "\u0e1d\u0e31\u0e3a", "\u0e1c\u0e33\u0e4e\u0e38", "\u0e0a\u0e35\u0e4d\u0e39", "\u0e20\u0e4b\u0e39", "\u0e05\u0e36\u0e47", "\u0e1d\u0e34\u0e47\u0e39", "\u0e0d\u0e36\u0e48\u0e39", "\u0e1a\u0e34\u0e4a\u0e38", "\u0e1e\u0e33\u0e47\u0e3a", "\u0e2b\u0e36\u0e4b\u0e3a", "\u0e17\u0e37\u0e4e\u0e39", "\u0e08\u0e4b\u0e38", "\u0e2a\u0e33\u0e4c\u0e39", "\u0e16\u0e31\u0e39", "\u0e19\u0e4b\u0e3a", "\u0e2c\u0e31\u0e4d\u0e39", "\u0e27\u0e33\u0e48", "\u0e28\u0e36\u0e4e", "\u0e08\u0e4c\u0e38", "\u0e01\u0e36\u0e49\u0e3a", "\u0e03\u0e35\u0e38", "\u0e0a\u0e37\u0e48\u0e39", "\u0e05\u0e36\u0e47\u0e3a", "\u0e1e\u0e33\u0e4b\u0e38", "\u0e1c\u0e34\u0e49\u0e3a", "\u0e29\u0e31\u0e4a\u0e39", "\u0e0e\u0e31\u0e4d\u0e39", "\u0e1e\u0e37\u0e4c\u0e3a", "\u0e2d\u0e36\u0e4d\u0e3a", "\u0e14\u0e31\u0e4d\u0e38", "\u0e0c\u0e36\u0e47\u0e39", "\u0e1a\u0e33\u0e4a\u0e3a", "\u0e1b\u0e37\u0e4b\u0e38", "\u0e08\u0e35", "\u0e2b\u0e34\u0e4b\u0e39", "\u0e17\u0e36\u0e48", "\u0e03\u0e37\u0e48\u0e38", "\u0e1c\u0e37\u0e4a\u0e38", "\u0e0e\u0e4c", "\u0e07\u0e35\u0e4c\u0e39", "\u0e1d\u0e35\u0e4b", "\u0e0c\u0e35\u0e4c\u0e38", "\u0e1e\u0e4c\u0e3a", "\u0e0d\u0e36\u0e4d\u0e3a", "\u0e20\u0e47\u0e3a", "\u0e05\u0e33\u0e4c\u0e39", "\u0e16\u0e35\u0e4d\u0e3a", "\u0e2a\u0e37\u0e47\u0e38", "\u0e07\u0e33\u0e4c\u0e38", "\u0e04\u0e35\u0e49\u0e38", "\u0e06\u0e31\u0e3a", "\u0e23\u0e48\u0e39", "\u0e29\u0e36\u0e4b", "\u0e1f\u0e35\u0e47", "\u0e2d\u0e37\u0e49\u0e3a", "\u0e0c\u0e34\u0e4e\u0e3a", "\u0e19\u0e33\u0e47", "\u0e29\u0e33", "\u0e22\u0e35\u0e48\u0e3a", "\u0e0f\u0e34\u0e48\u0e38", "\u0e2c\u0e31\u0e49\u0e39", "\u0e04\u0e36\u0e48\u0e39", "\u0e29\u0e34\u0e47\u0e39", "\u0e04\u0e31\u0e4b\u0e38", "\u0e27\u0e4e\u0e38", "\u0e11\u0e35\u0e4a\u0e39", "\u0e2c\u0e34\u0e4d\u0e3a", "\u0e0f\u0e36\u0e4a\u0e38", "\u0e05\u0e33\u0e4b\u0e39", "\u0e28\u0e33\u0e4e\u0e38", "\u0e20\u0e33\u0e47\u0e39", "\u0e2a\u0e3a", "\u0e0f\u0e34\u0e48", "\u0e03\u0e31\u0e4c\u0e3a", "\u0e1d\u0e37\u0e4d\u0e39", "\u0e2a\u0e36\u0e48", "\u0e0c\u0e4e\u0e39", "\u0e1f\u0e35\u0e4e\u0e3a", "\u0e22\u0e38", "\u0e0a\u0e4c\u0e38", "\u0e1e\u0e33\u0e49\u0e3a", "\u0e2c\u0e31\u0e4b\u0e3a", "\u0e16\u0e31\u0e4c\u0e38", "\u0e03\u0e33\u0e49\u0e3a", "\u0e17\u0e37\u0e48\u0e39", "\u0e17\u0e31\u0e4b", "\u0e1e\u0e34\u0e4c\u0e38", "\u0e15\u0e36\u0e47\u0e39", "\u0e28\u0e35\u0e4e\u0e3a", "\u0e17\u0e31\u0e4d\u0e3a", "\u0e01\u0e34\u0e38", "\u0e2d\u0e31\u0e4a\u0e39", "\u0e0c\u0e33\u0e4c\u0e3a", "\u0e1d\u0e36\u0e4e\u0e3a", "\u0e0d\u0e33\u0e4c", "\u0e0c\u0e33\u0e4e\u0e39", "\u0e2e\u0e36\u0e4d", "\u0e07\u0e33\u0e4d\u0e38", "\u0e22\u0e35\u0e4a", "\u0e27\u0e39", "\u0e18", "\u0e19\u0e33\u0e4b\u0e39", "\u0e08\u0e4e", "\u0e14\u0e34\u0e48\u0e3a", "\u0e06\u0e4d\u0e39", "\u0e22\u0e33\u0e39", "\u0e04\u0e31\u0e4e\u0e38", "\u0e2d\u0e31\u0e4b\u0e38", "\u0e0a\u0e36\u0e4e\u0e38", "\u0e1d\u0e36\u0e49\u0e38", "\u0e08\u0e4a\u0e39", "\u0e06\u0e35\u0e48\u0e38", "\u0e21\u0e36\u0e39", "\u0e1b\u0e31\u0e4c", "\u0e0c\u0e33\u0e47", "\u0e17\u0e4c\u0e39", "\u0e06\u0e34\u0e4c", "\u0e0b\u0e33\u0e4b\u0e39", "\u0e19\u0e37\u0e4b\u0e39", "\u0e1b\u0e35\u0e4b\u0e38", "\u0e1b\u0e33\u0e48\u0e3a", "\u0e17\u0e35\u0e4a\u0e3a", "\u0e23\u0e36\u0e4e", "\u0e23\u0e31\u0e4d\u0e39", "\u0e12\u0e4c\u0e39", "\u0e23\u0e36\u0e4b\u0e3a", "\u0e18\u0e37\u0e4c\u0e3a", "\u0e1a\u0e36\u0e47\u0e38", "\u0e1c", "\u0e04\u0e33\u0e47", "\u0e02\u0e31\u0e4a\u0e38", "\u0e17\u0e37\u0e4d\u0e39", "\u0e1d\u0e34\u0e48\u0e39", "\u0e2c\u0e35\u0e4e", "\u0e21\u0e33\u0e4e", "\u0e18\u0e37\u0e4d\u0e39", "\u0e1a\u0e4e\u0e39", "\u0e0e\u0e37", "\u0e2d\u0e37\u0e4a\u0e39", "\u0e09\u0e37\u0e4b", "\u0e07\u0e31\u0e49\u0e3a", "\u0e02\u0e33\u0e3a", "\u0e2a\u0e4a\u0e3a", "\u0e29\u0e37\u0e4e\u0e39", "\u0e2e\u0e37\u0e4d\u0e39", "\u0e04\u0e48\u0e38", "\u0e01\u0e4d\u0e39", "\u0e1b\u0e37\u0e3a", "\u0e0f\u0e36\u0e4b", "\u0e0d\u0e31\u0e49\u0e3a", "\u0e2e\u0e31\u0e47", "\u0e1a\u0e31\u0e4c\u0e39", "\u0e18\u0e33\u0e48", "\u0e03\u0e34\u0e4b\u0e3a", "\u0e12\u0e37\u0e47\u0e39", "\u0e1b\u0e31\u0e47", "\u0e23\u0e34\u0e4e\u0e3a", "\u0e13\u0e31\u0e4b\u0e38", "\u0e2c\u0e37\u0e47", "\u0e10\u0e36\u0e48", "\u0e05\u0e4e", "\u0e1d\u0e34\u0e49\u0e39", "\u0e06\u0e37\u0e3a", "\u0e15\u0e33\u0e3a", "\u0e2b\u0e35\u0e4e\u0e3a", "\u0e21\u0e37\u0e4b\u0e39", "\u0e15\u0e37\u0e4e", "\u0e01\u0e37\u0e49", "\u0e18\u0e36\u0e4c\u0e3a", "\u0e18\u0e36\u0e49\u0e3a", "\u0e0d\u0e34\u0e49\u0e38", "\u0e25\u0e31\u0e4a", "\u0e2a\u0e31\u0e49", "\u0e0d\u0e31\u0e47", "\u0e10\u0e35\u0e48\u0e38", "\u0e22\u0e31\u0e4b\u0e3a", "\u0e2c\u0e33\u0e4e\u0e38", "\u0e1a\u0e34\u0e4e\u0e3a", "\u0e29\u0e33\u0e4a\u0e3a", "\u0e0a\u0e37\u0e47", "\u0e1e\u0e33\u0e4a\u0e3a", "\u0e2c\u0e36\u0e4c\u0e3a", "\u0e16\u0e37\u0e4e\u0e39", "\u0e0d\u0e31\u0e4c\u0e3a", "\u0e2a\u0e37\u0e4c\u0e39", "\u0e15\u0e35\u0e4d\u0e39", "\u0e0e\u0e34\u0e4a\u0e3a", "\u0e04\u0e31\u0e4e\u0e39", "\u0e2b\u0e33\u0e49\u0e38", "\u0e19\u0e4a\u0e3a", "\u0e04\u0e37\u0e4d\u0e38", "\u0e1f\u0e4a", "\u0e0d\u0e33", "\u0e1e\u0e31\u0e4e\u0e38", "\u0e10\u0e33\u0e39", "\u0e1d\u0e35\u0e48", "\u0e16\u0e36", "\u0e01\u0e31\u0e48\u0e38", "\u0e20\u0e34\u0e4c\u0e38", "\u0e04\u0e33\u0e47\u0e38", "\u0e18\u0e37\u0e4c\u0e39", "\u0e05\u0e33\u0e47\u0e38", "\u0e11\u0e31\u0e4a\u0e3a", "\u0e2c\u0e4a\u0e39", "\u0e1b\u0e36\u0e38", "\u0e20\u0e33\u0e3a", "\u0e2c\u0e37\u0e39", "\u0e2c\u0e47", "\u0e21\u0e37\u0e47", "\u0e0e\u0e31\u0e48\u0e3a", "\u0e1c\u0e36\u0e48", "\u0e0b\u0e35\u0e49\u0e38", "\u0e04\u0e34\u0e3a", "\u0e17\u0e33\u0e4c\u0e38", "\u0e20\u0e37\u0e4b", "\u0e19\u0e36\u0e47", "\u0e27\u0e38", "\u0e02\u0e35\u0e4b\u0e3a", "\u0e2a\u0e35\u0e4a\u0e39", "\u0e2b\u0e35\u0e4e\u0e39", "\u0e1f\u0e35\u0e4b\u0e38", "\u0e27\u0e31\u0e4c\u0e38", "\u0e18\u0e33\u0e4a\u0e39", "\u0e1e\u0e31\u0e4d\u0e39", "\u0e18\u0e35\u0e49", "\u0e25\u0e37\u0e4a", "\u0e17\u0e37\u0e48", "\u0e06\u0e34\u0e48\u0e38", "\u0e1e\u0e33\u0e4b\u0e39", "\u0e0e\u0e36\u0e4c\u0e39", "\u0e06\u0e34\u0e4d\u0e39", "\u0e2d\u0e37\u0e47", "\u0e21\u0e33\u0e4d\u0e3a", "\u0e1e\u0e35\u0e39", "\u0e23\u0e33\u0e49", "\u0e16\u0e34\u0e4c", "\u0e15\u0e37\u0e49\u0e38", "\u0e2d\u0e36\u0e4c\u0e38", "\u0e11\u0e31\u0e49\u0e38", "\u0e03\u0e34\u0e48\u0e3a", "\u0e1e\u0e36\u0e48\u0e38", "\u0e21\u0e31\u0e4e\u0e39", "\u0e0c\u0e35\u0e4d", "\u0e21\u0e34\u0e4e\u0e38", "\u0e22\u0e34\u0e49\u0e38", "\u0e13\u0e37\u0e4c\u0e3a", "\u0e2c\u0e4c\u0e39", "\u0e11\u0e36\u0e4b\u0e39", "\u0e2b\u0e33\u0e47", "\u0e20\u0e37\u0e4c\u0e39", "\u0e1c\u0e37\u0e47\u0e39", "\u0e15\u0e4d\u0e39", "\u0e03\u0e33\u0e49\u0e38", "\u0e1b\u0e34\u0e4c\u0e3a", "\u0e28\u0e35\u0e4c\u0e39", "\u0e22\u0e37\u0e47", "\u0e17\u0e36\u0e47\u0e3a", "\u0e1c\u0e31\u0e48\u0e3a", "\u0e2b\u0e34\u0e4d\u0e38", "\u0e0b\u0e31\u0e4d\u0e3a", "\u0e2b\u0e37\u0e49\u0e39", "\u0e07\u0e35\u0e49\u0e38", "\u0e0a\u0e49", "\u0e21\u0e33\u0e39", "\u0e21\u0e34\u0e4c", "\u0e16\u0e31\u0e4b\u0e38", "\u0e25\u0e34\u0e49\u0e38", "\u0e18\u0e34\u0e4e\u0e3a", "\u0e15\u0e33\u0e4a\u0e3a", "\u0e17\u0e33\u0e4d\u0e38", "\u0e04\u0e35\u0e48\u0e3a", "\u0e02\u0e47\u0e39", "\u0e1d\u0e37\u0e47", "\u0e03\u0e37\u0e49", "\u0e03\u0e35\u0e4b", "\u0e02\u0e31\u0e4d", "\u0e28\u0e37\u0e4c\u0e39", "\u0e2d\u0e31\u0e49\u0e39", "\u0e0e\u0e37\u0e4d\u0e3a", "\u0e1d\u0e49", "\u0e01\u0e33\u0e4e\u0e39", "\u0e09\u0e33\u0e4d\u0e3a", "\u0e22\u0e36\u0e4b\u0e3a", "\u0e0f\u0e37\u0e4c\u0e39", "\u0e16\u0e35\u0e48", "\u0e0c\u0e34\u0e4b\u0e3a", "\u0e29\u0e37\u0e4d\u0e3a", "\u0e23\u0e34\u0e49", "\u0e0e\u0e35\u0e4a\u0e3a", "\u0e0e\u0e34\u0e49\u0e38", "\u0e2c\u0e36\u0e4d", "\u0e1a\u0e35\u0e4e", "\u0e09\u0e31\u0e4c", "\u0e17\u0e33\u0e4e", "\u0e21\u0e31\u0e4a", "\u0e06\u0e31\u0e48\u0e38", "\u0e29\u0e31\u0e4b\u0e39", "\u0e01\u0e37\u0e4d\u0e39", "\u0e0f\u0e34\u0e47\u0e38", "\u0e05\u0e33\u0e49\u0e3a", "\u0e2d\u0e33\u0e39", "\u0e0c\u0e34\u0e47\u0e39", "\u0e11\u0e37", "\u0e1a\u0e33\u0e4e\u0e39", "\u0e06\u0e36\u0e47\u0e3a", "\u0e0e\u0e37\u0e4c\u0e38", "\u0e15\u0e34\u0e47\u0e3a", "\u0e27\u0e37\u0e4a\u0e38", "\u0e16\u0e36\u0e39", "\u0e0e\u0e31", "\u0e0d\u0e36\u0e39", "\u0e2a\u0e31\u0e49\u0e38", "\u0e0c\u0e4a\u0e38", "\u0e10\u0e31\u0e47\u0e39", "\u0e2e\u0e37\u0e4b\u0e38", "\u0e02\u0e36\u0e49\u0e3a", "\u0e08\u0e33\u0e4d\u0e39", "\u0e03\u0e34\u0e47\u0e39", "\u0e28\u0e31", "\u0e20\u0e47\u0e39", "\u0e2a\u0e33\u0e4c", "\u0e13\u0e35\u0e4b\u0e3a", "\u0e2b\u0e3a", "\u0e25\u0e4e\u0e38", "\u0e1e\u0e35\u0e47", "\u0e20\u0e4d\u0e39", "\u0e09\u0e34\u0e4b\u0e38", "\u0e1b\u0e35\u0e4e\u0e39", "\u0e11\u0e34\u0e4c", "\u0e27\u0e34\u0e48", "\u0e04\u0e33\u0e49", "\u0e20\u0e34\u0e48\u0e38", "\u0e0e\u0e31\u0e4d\u0e38", "\u0e0e\u0e47\u0e3a", "\u0e0c\u0e37\u0e4a", "\u0e0c\u0e36\u0e4e", "\u0e1a\u0e36\u0e4b\u0e39", "\u0e17\u0e31\u0e48", "\u0e01\u0e35\u0e47", "\u0e0e\u0e34\u0e4b", "\u0e0f\u0e31\u0e48\u0e39", "\u0e2a\u0e35\u0e4b\u0e3a", "\u0e25\u0e31\u0e4d\u0e3a", "\u0e07\u0e33\u0e4c", "\u0e1c\u0e4c\u0e3a", "\u0e01\u0e31\u0e4c\u0e39", "\u0e21\u0e35\u0e4d\u0e39", "\u0e1c\u0e36\u0e4b\u0e39", "\u0e22\u0e34\u0e4c\u0e38", "\u0e01\u0e35\u0e4d\u0e38", "\u0e05\u0e4e\u0e3a", "\u0e08\u0e34\u0e49\u0e39", "\u0e28\u0e37\u0e49\u0e38", "\u0e1c\u0e4e\u0e39", "\u0e17\u0e36\u0e4b\u0e3a", "\u0e09\u0e34\u0e4b\u0e39", "\u0e27\u0e31\u0e4e", "\u0e1b\u0e34\u0e4b\u0e39", "\u0e12\u0e35\u0e48\u0e38", "\u0e06\u0e36\u0e4d", "\u0e1d\u0e31\u0e4a\u0e38", "\u0e19\u0e34\u0e48\u0e38", "\u0e29\u0e35\u0e4b", "\u0e2e\u0e4c", "\u0e2e\u0e4c\u0e39", "\u0e01\u0e36\u0e4c\u0e39", "\u0e04\u0e33\u0e48\u0e38", "\u0e28\u0e34\u0e49", "\u0e15\u0e31\u0e4e\u0e39", "\u0e2a\u0e39", "\u0e0d\u0e33\u0e4b\u0e38", "\u0e14\u0e36\u0e48\u0e38", "\u0e2c\u0e4b\u0e39", "\u0e04\u0e36\u0e4e\u0e3a", "\u0e25\u0e34\u0e4e\u0e3a", "\u0e0a\u0e31\u0e4c\u0e3a", "\u0e1b\u0e36\u0e4b\u0e38", "\u0e1f\u0e34\u0e4e\u0e38", "\u0e1c\u0e37\u0e47\u0e38", "\u0e1c\u0e49\u0e3a", "\u0e17\u0e35\u0e49\u0e3a", "\u0e28\u0e36\u0e4d", "\u0e2a\u0e33\u0e4d\u0e38", "\u0e0c\u0e33\u0e48\u0e39", "\u0e2c\u0e31\u0e39", "\u0e04\u0e36\u0e49\u0e39", "\u0e20\u0e37\u0e4e\u0e38", "\u0e13\u0e34\u0e47\u0e3a", "\u0e1a\u0e33\u0e4e\u0e3a", "\u0e0e\u0e31\u0e48\u0e39", "\u0e16\u0e33\u0e4e\u0e3a", "\u0e2a\u0e31\u0e49\u0e3a", "\u0e01\u0e31\u0e49\u0e38", "\u0e02\u0e35\u0e4a\u0e38", "\u0e18\u0e36\u0e49\u0e39", "\u0e04\u0e47\u0e3a", "\u0e2b\u0e37\u0e4c\u0e38", "\u0e0f\u0e33\u0e4c\u0e3a", "\u0e1a\u0e34\u0e4d\u0e38", "\u0e08\u0e34\u0e4b\u0e38", "\u0e12\u0e35\u0e4c\u0e39", "\u0e0b\u0e34\u0e48\u0e3a", "\u0e0b\u0e34\u0e4b\u0e3a", "\u0e0c\u0e35\u0e4b", "\u0e15\u0e36\u0e48\u0e38", "\u0e02\u0e31\u0e47\u0e39", "\u0e0e\u0e35\u0e4c", "\u0e1f\u0e37\u0e4a\u0e3a", "\u0e2a\u0e33\u0e49\u0e39", "\u0e1e\u0e36\u0e4e\u0e39", "\u0e0b\u0e31\u0e4c\u0e3a", "\u0e19\u0e36\u0e4c\u0e3a", "\u0e1b\u0e35\u0e49\u0e3a", "\u0e21\u0e35\u0e4b", "\u0e1f\u0e37\u0e48\u0e3a", "\u0e29\u0e33\u0e47\u0e38", "\u0e0e\u0e31\u0e47\u0e39", "\u0e08", "\u0e1e\u0e33\u0e4c\u0e3a", "\u0e2c\u0e4b\u0e38", "\u0e07\u0e4d\u0e3a", "\u0e05\u0e35\u0e4a\u0e3a", "\u0e0b\u0e35\u0e4b", "\u0e2a\u0e36\u0e4b", "\u0e19\u0e4d\u0e3a", "\u0e04\u0e47\u0e39", "\u0e11\u0e36\u0e47\u0e3a", "\u0e15\u0e31\u0e4e", "\u0e22\u0e35\u0e4d\u0e39", "\u0e13\u0e34\u0e49", "\u0e01\u0e47\u0e38", "\u0e28\u0e35\u0e47\u0e3a", "\u0e18\u0e35\u0e48\u0e39", "\u0e19\u0e35\u0e4e\u0e39", "\u0e0a\u0e4d", "\u0e0f\u0e36\u0e47\u0e39", "\u0e09\u0e37\u0e4e\u0e38", "\u0e05\u0e33\u0e4d\u0e39", "\u0e0e\u0e36\u0e4e\u0e39", "\u0e02\u0e34\u0e3a", "\u0e2b\u0e4a\u0e38", "\u0e2e\u0e37\u0e4e\u0e38", "\u0e0c\u0e33\u0e4b\u0e39", "\u0e04\u0e37\u0e48\u0e38", "\u0e29\u0e34\u0e4d\u0e38", "\u0e2c\u0e34\u0e48\u0e39", "\u0e27\u0e31\u0e4c\u0e39", "\u0e29\u0e37\u0e49\u0e38", "\u0e1d\u0e33\u0e4c\u0e38", "\u0e05\u0e34\u0e4a\u0e38", "\u0e15\u0e34\u0e4b\u0e38", "\u0e1c\u0e31\u0e4d\u0e39", "\u0e04\u0e37\u0e47\u0e39", "\u0e1b\u0e34\u0e4d\u0e3a", "\u0e07\u0e48", "\u0e2e\u0e36\u0e4a\u0e38", "\u0e17\u0e4e", "\u0e22\u0e37\u0e49\u0e3a", "\u0e2a\u0e36\u0e4b\u0e39", "\u0e19\u0e31\u0e4e", "\u0e27\u0e33", "\u0e08\u0e31\u0e4b\u0e3a", "\u0e13\u0e35\u0e49\u0e39", "\u0e29\u0e33\u0e4e\u0e38", "\u0e13\u0e34\u0e38", "\u0e0b\u0e33\u0e48\u0e3a", "\u0e1c\u0e33\u0e47", "\u0e05\u0e37\u0e4d", "\u0e29\u0e33\u0e4e\u0e39", "\u0e0f\u0e35\u0e47", "\u0e05\u0e35\u0e3a", "\u0e09\u0e31\u0e48\u0e3a", "\u0e0a\u0e31\u0e4a\u0e39", "\u0e0c\u0e33\u0e38", "\u0e21\u0e47\u0e39", "\u0e06\u0e35\u0e4b\u0e39", "\u0e06\u0e34\u0e48\u0e3a", "\u0e10\u0e31\u0e4d\u0e39", "\u0e1d\u0e34\u0e48", "\u0e2b\u0e35\u0e48", "\u0e28\u0e36\u0e48\u0e39", "\u0e05\u0e33\u0e4e\u0e39", "\u0e01\u0e35\u0e4b\u0e39", "\u0e06\u0e31\u0e4a\u0e3a", "\u0e1e\u0e4c", "\u0e14\u0e37\u0e4c", "\u0e09\u0e34\u0e4a", "\u0e1c\u0e36\u0e3a", "\u0e22\u0e31\u0e4b\u0e38", "\u0e09\u0e31\u0e38", "\u0e25\u0e31\u0e4c\u0e38", "\u0e23\u0e39", "\u0e0b\u0e35\u0e47\u0e3a", "\u0e2b\u0e33\u0e48", "\u0e06\u0e37\u0e4d", "\u0e02\u0e34\u0e4e\u0e39", "\u0e12\u0e35\u0e4a\u0e3a", "\u0e2e\u0e31\u0e4b\u0e3a", "\u0e1d\u0e36\u0e47\u0e38", "\u0e2b\u0e34\u0e4a", "\u0e1a\u0e37\u0e4d", "\u0e28\u0e31\u0e47\u0e3a", "\u0e16\u0e31\u0e4a\u0e3a", "\u0e25\u0e34\u0e48\u0e3a", "\u0e19\u0e4e", "\u0e0d\u0e4e", "\u0e21\u0e37\u0e4c\u0e38", "\u0e12\u0e31\u0e4b\u0e3a", "\u0e01\u0e37\u0e47\u0e39", "\u0e04\u0e48\u0e3a", "\u0e20\u0e37\u0e49\u0e39", "\u0e16\u0e34\u0e48\u0e39", "\u0e0c\u0e4a\u0e3a", "\u0e12\u0e47\u0e39", "\u0e13\u0e31\u0e4d", "\u0e04\u0e49\u0e39", "\u0e15\u0e36\u0e4a", "\u0e0b\u0e4a\u0e38", "\u0e18\u0e31\u0e4e\u0e39", "\u0e13\u0e36\u0e4e", "\u0e18\u0e4a\u0e39", "\u0e16\u0e33\u0e48\u0e38", "\u0e18\u0e35\u0e49\u0e38", "\u0e2d\u0e33\u0e49\u0e39", "\u0e2c\u0e33\u0e4b\u0e3a", "\u0e0d\u0e33\u0e47", "\u0e01\u0e31\u0e4a\u0e38", "\u0e12\u0e37\u0e4c\u0e3a", "\u0e1c\u0e36\u0e4a\u0e38", "\u0e1c\u0e37\u0e39", "\u0e1c\u0e37\u0e4b\u0e39", "\u0e01\u0e31\u0e48\u0e3a", "\u0e11\u0e31\u0e4e\u0e39", "\u0e0c\u0e37\u0e4d\u0e38", "\u0e17\u0e35\u0e47\u0e3a", "\u0e05\u0e31\u0e4a\u0e3a", "\u0e11\u0e33\u0e38", "\u0e12\u0e34\u0e39", "\u0e03\u0e34\u0e4d", "\u0e27\u0e37\u0e4c\u0e39", "\u0e2a\u0e36\u0e48\u0e3a", "\u0e0f\u0e33\u0e47\u0e39", "\u0e1f\u0e35\u0e39", "\u0e07\u0e37\u0e4d", "\u0e0f\u0e33\u0e4b\u0e3a", "\u0e0b\u0e33\u0e49\u0e3a", "\u0e0f\u0e37\u0e49", "\u0e2d\u0e34\u0e48\u0e38", "\u0e22\u0e34\u0e4a\u0e39", "\u0e2c\u0e37\u0e4a\u0e39", "\u0e16\u0e4b\u0e3a", "\u0e17\u0e31\u0e4e\u0e3a", "\u0e20\u0e35\u0e3a", "\u0e03\u0e31\u0e49\u0e39", "\u0e0a\u0e35\u0e48\u0e39", "\u0e23\u0e31\u0e4d\u0e38", "\u0e11\u0e36\u0e49\u0e39", "\u0e05\u0e36", "\u0e1a\u0e4b\u0e3a", "\u0e21\u0e36\u0e49\u0e3a", "\u0e1d\u0e33\u0e4c\u0e3a", "\u0e0e\u0e33\u0e48\u0e38", "\u0e22\u0e33\u0e4a", "\u0e0a\u0e36\u0e49\u0e3a", "\u0e15\u0e34\u0e47\u0e38", "\u0e11\u0e33\u0e4c\u0e3a", "\u0e1d\u0e33\u0e4a", "\u0e22\u0e31\u0e38", "\u0e2e\u0e31\u0e4d\u0e38", "\u0e1b\u0e48\u0e3a", "\u0e16\u0e37\u0e4e", "\u0e2d\u0e33\u0e47\u0e39", "\u0e27\u0e34\u0e4d\u0e3a", "\u0e1f\u0e31\u0e39", "\u0e02\u0e35\u0e49\u0e3a", "\u0e0d\u0e4e\u0e38", "\u0e1a\u0e36\u0e47", "\u0e09\u0e37\u0e4a\u0e38", "\u0e1c\u0e34\u0e4d\u0e3a", "\u0e23\u0e35\u0e48\u0e3a", "\u0e06\u0e36\u0e4c\u0e3a", "\u0e01\u0e31\u0e4e\u0e3a", "\u0e25\u0e34\u0e4a\u0e38", "\u0e29\u0e31\u0e48\u0e38", "\u0e04\u0e34\u0e39", "\u0e0a\u0e33\u0e4a\u0e39", "\u0e02\u0e33\u0e4a", "\u0e17\u0e36\u0e47", "\u0e23\u0e36\u0e48\u0e3a", "\u0e28\u0e34\u0e4d\u0e38", "\u0e1a\u0e31\u0e4d\u0e38", "\u0e09\u0e36\u0e39", "\u0e28\u0e33\u0e4a\u0e39", "\u0e16\u0e31\u0e4c", "\u0e0a\u0e33\u0e48", "\u0e11\u0e33\u0e49\u0e39", "\u0e17\u0e35\u0e4d\u0e38", "\u0e0a\u0e31\u0e39", "\u0e12\u0e35\u0e47\u0e3a", "\u0e03\u0e35\u0e4c", "\u0e0f\u0e35\u0e4c\u0e39", "\u0e16\u0e35\u0e38", "\u0e20\u0e34\u0e4a\u0e39", "\u0e14\u0e33\u0e4d", "\u0e18\u0e36\u0e4d\u0e39", "\u0e1e\u0e31\u0e47\u0e3a", "\u0e2e\u0e31\u0e47\u0e3a", "\u0e1b\u0e36\u0e4b", "\u0e0b\u0e31\u0e3a", "\u0e1b\u0e35\u0e4e", "\u0e08\u0e36\u0e4a\u0e38", "\u0e23\u0e35", "\u0e09\u0e35\u0e49\u0e38", "\u0e19\u0e34\u0e4e", "\u0e1f\u0e4e\u0e38", "\u0e02\u0e35", "\u0e12\u0e36\u0e4c\u0e3a", "\u0e16\u0e33\u0e47", "\u0e1f\u0e33\u0e4e\u0e3a", "\u0e09\u0e49\u0e3a", "\u0e23\u0e4c\u0e3a", "\u0e06\u0e37\u0e48\u0e39", "\u0e27\u0e35\u0e49\u0e3a", "\u0e09\u0e33\u0e48\u0e38", "\u0e2e\u0e36\u0e4d\u0e38", "\u0e03\u0e31\u0e4e", "\u0e08\u0e36\u0e48\u0e39", "\u0e0e\u0e33\u0e4e\u0e38", "\u0e27\u0e31", "\u0e01\u0e34\u0e4a\u0e38", "\u0e21\u0e33\u0e4a\u0e38", "\u0e08\u0e35\u0e4c", "\u0e20\u0e31\u0e4b\u0e3a", "\u0e18\u0e4d\u0e39", "\u0e2e\u0e33\u0e49\u0e38", "\u0e19\u0e33\u0e49\u0e38", "\u0e17\u0e34\u0e48\u0e39", "\u0e05\u0e4c", "\u0e28\u0e35\u0e3a", "\u0e25\u0e33\u0e3a", "\u0e0d\u0e33\u0e4a\u0e39", "\u0e27\u0e37\u0e4d\u0e38", "\u0e0e\u0e35\u0e48\u0e39", "\u0e23\u0e33\u0e4c\u0e39", "\u0e01\u0e37\u0e47\u0e38", "\u0e08\u0e37\u0e4a\u0e3a", "\u0e21\u0e36\u0e4d\u0e38", "\u0e07\u0e31\u0e39", "\u0e25\u0e37\u0e49", "\u0e18\u0e35\u0e3a", "\u0e04\u0e31\u0e48\u0e39", "\u0e2c\u0e35", "\u0e0f\u0e31\u0e39", "\u0e14\u0e36\u0e47\u0e39", "\u0e2a\u0e34\u0e4e", "\u0e1b\u0e37\u0e4d\u0e3a", "\u0e02\u0e3a", "\u0e10\u0e31\u0e4c\u0e39", "\u0e10\u0e37\u0e48\u0e3a", "\u0e1e\u0e37\u0e49", "\u0e22\u0e35\u0e47\u0e39", "\u0e1f\u0e35\u0e49\u0e38", "\u0e2c\u0e34\u0e4e", "\u0e11\u0e33\u0e4b\u0e38", "\u0e2b\u0e35\u0e47\u0e38", "\u0e27\u0e34\u0e4b\u0e39", "\u0e17\u0e37\u0e4e", "\u0e04\u0e37", "\u0e27\u0e37\u0e47\u0e38", "\u0e1c\u0e34\u0e3a", "\u0e2b\u0e34\u0e4c\u0e39", "\u0e02\u0e37\u0e3a", "\u0e17\u0e36\u0e47\u0e38", "\u0e10\u0e35\u0e48\u0e3a", "\u0e0a\u0e31\u0e4b\u0e39", "\u0e15\u0e33\u0e4e", "\u0e1a\u0e35\u0e4d\u0e39", "\u0e04\u0e35\u0e4e\u0e38", "\u0e2c\u0e33\u0e47\u0e3a", "\u0e29\u0e37\u0e4b\u0e38", "\u0e17\u0e31\u0e4c\u0e38", "\u0e17\u0e35\u0e48", "\u0e1a\u0e37\u0e49", "\u0e1c\u0e31\u0e4d\u0e38", "\u0e06\u0e31\u0e4c", "\u0e1c\u0e37\u0e49\u0e39", "\u0e15\u0e33\u0e4a\u0e38", "\u0e0f\u0e36\u0e48", "\u0e02\u0e33\u0e48", "\u0e27\u0e34\u0e48\u0e38", "\u0e2c\u0e36\u0e47", "\u0e1b\u0e4b\u0e38", "\u0e11\u0e34\u0e47\u0e3a", "\u0e20\u0e36\u0e4d\u0e38", "\u0e2a\u0e35\u0e4d\u0e38", "\u0e18\u0e36\u0e38", "\u0e07\u0e36\u0e4e\u0e3a", "\u0e0b\u0e35", "\u0e14\u0e34\u0e4d\u0e38", "\u0e2e\u0e33\u0e47\u0e39", "\u0e2a", "\u0e22\u0e33\u0e4d", "\u0e08\u0e31\u0e4d", "\u0e11\u0e36\u0e48\u0e3a", "\u0e1e\u0e31\u0e48\u0e38", "\u0e1c\u0e34\u0e4e\u0e39", "\u0e02\u0e33\u0e4e", "\u0e2a\u0e37\u0e48\u0e3a", "\u0e05\u0e49\u0e3a", "\u0e1c\u0e37\u0e3a", "\u0e0b\u0e37\u0e4a", "\u0e1f\u0e34\u0e4a\u0e3a", "\u0e11\u0e47", "\u0e19\u0e33\u0e4c\u0e3a", "\u0e01\u0e36\u0e4e\u0e38", "\u0e10\u0e35\u0e4b", "\u0e2d\u0e39", "\u0e14\u0e4e\u0e3a", "\u0e09\u0e35\u0e49\u0e3a", "\u0e23\u0e34\u0e49\u0e39", "\u0e28\u0e34\u0e4c", "\u0e01\u0e35\u0e47\u0e38", "\u0e1a\u0e34\u0e48\u0e38", "\u0e21\u0e36\u0e47\u0e38", "\u0e17\u0e37\u0e4c\u0e3a", "\u0e28\u0e35\u0e4a\u0e38", "\u0e1b\u0e37\u0e4c", "\u0e27\u0e34\u0e4b", "\u0e02\u0e36\u0e4e\u0e3a", "\u0e03\u0e37\u0e4e", "\u0e1b\u0e33\u0e4c\u0e39", "\u0e13\u0e31\u0e4b\u0e39", "\u0e0b\u0e33\u0e4b", "\u0e27\u0e37\u0e4d\u0e39", "\u0e2e\u0e34\u0e48", "\u0e0a\u0e36\u0e4e\u0e3a", "\u0e22\u0e31\u0e4e", "\u0e12\u0e31\u0e47\u0e3a", "\u0e28\u0e4c", "\u0e28\u0e31\u0e4e\u0e3a", "\u0e29\u0e37\u0e4c\u0e39", "\u0e2b\u0e35\u0e4c", "\u0e2a\u0e37\u0e47", "\u0e1c\u0e37\u0e47\u0e3a", "\u0e0b\u0e33\u0e4b\u0e3a", "\u0e23\u0e35\u0e47", "\u0e05\u0e31\u0e48", "\u0e08\u0e31\u0e4c\u0e3a", "\u0e1f\u0e35\u0e3a", "\u0e19\u0e4e\u0e38", "\u0e27\u0e31\u0e4b\u0e3a", "\u0e2a\u0e37\u0e4d\u0e39", "\u0e2b\u0e35\u0e4a\u0e39", "\u0e03\u0e34\u0e4d\u0e39", "\u0e04\u0e33", "\u0e21\u0e35\u0e49", "\u0e18\u0e4b\u0e38", "\u0e09\u0e36\u0e48\u0e3a", "\u0e19\u0e35\u0e47\u0e38", "\u0e2d\u0e37\u0e49", "\u0e1f\u0e47", "\u0e12\u0e37\u0e4e", "\u0e18\u0e37\u0e49", "\u0e05\u0e33\u0e49", "\u0e1e\u0e34\u0e4a", "\u0e29\u0e37\u0e4d", "\u0e2e\u0e49", "\u0e13\u0e37\u0e4b", "\u0e1d\u0e47\u0e39", "\u0e04\u0e31\u0e49\u0e3a", "\u0e23\u0e4e", "\u0e01\u0e37\u0e4b\u0e39", "\u0e0f\u0e34\u0e4e\u0e3a", "\u0e0b\u0e31\u0e47\u0e39", "\u0e2d\u0e33", "\u0e29\u0e33\u0e48\u0e38", "\u0e0e\u0e48\u0e38", "\u0e07\u0e33\u0e47", "\u0e19\u0e36\u0e4e", "\u0e15\u0e34\u0e48", "\u0e2a\u0e36\u0e4e\u0e3a", "\u0e09\u0e4a\u0e3a", "\u0e2d\u0e37\u0e4b", "\u0e11\u0e35\u0e48", "\u0e19\u0e34", "\u0e1c\u0e35\u0e38", "\u0e25\u0e35\u0e4e\u0e38", "\u0e12\u0e36\u0e4a\u0e3a", "\u0e08\u0e36\u0e38", "\u0e0e\u0e4d\u0e38", "\u0e14\u0e33\u0e49\u0e3a", "\u0e07\u0e33\u0e4a\u0e38", "\u0e2e\u0e33\u0e4b\u0e38", "\u0e2d\u0e34\u0e49", "\u0e0e\u0e36\u0e4e", "\u0e06\u0e34\u0e4a\u0e39", "\u0e14\u0e33\u0e4b\u0e39", "\u0e15\u0e35\u0e4a\u0e3a", "\u0e2e\u0e33\u0e47\u0e3a", "\u0e18\u0e31\u0e49\u0e3a", "\u0e27\u0e31\u0e47\u0e3a", "\u0e11\u0e4a\u0e39", "\u0e12\u0e33\u0e4a\u0e38", "\u0e02\u0e33\u0e4b\u0e3a", "\u0e2d\u0e35\u0e4b\u0e38", "\u0e28\u0e31\u0e47\u0e39", "\u0e11\u0e37\u0e4e\u0e39", "\u0e19\u0e33\u0e4d\u0e39", "\u0e1f\u0e36\u0e4e\u0e3a", "\u0e13\u0e37\u0e4e\u0e38", "\u0e1e\u0e34\u0e4b\u0e38", "\u0e2a\u0e31\u0e4d\u0e38", "\u0e27\u0e31\u0e4b\u0e39", "\u0e1d\u0e37\u0e4b", "\u0e09\u0e36\u0e4d\u0e3a", "\u0e13\u0e31\u0e48\u0e39", "\u0e23\u0e37\u0e4b\u0e3a", "\u0e0e\u0e31\u0e4c\u0e39", "\u0e15\u0e35\u0e4e\u0e38", "\u0e2c\u0e33\u0e4d\u0e3a", "\u0e21\u0e37\u0e4b\u0e3a", "\u0e01\u0e37\u0e47\u0e3a", "\u0e2b\u0e31\u0e38", "\u0e29\u0e4d\u0e38", "\u0e05\u0e31\u0e4a", "\u0e04\u0e33\u0e47\u0e3a", "\u0e15\u0e37\u0e4e\u0e39", "\u0e07\u0e36\u0e4a", "\u0e20\u0e33\u0e4a\u0e38", "\u0e05\u0e35\u0e4d\u0e39", "\u0e07\u0e35\u0e4d", "\u0e06\u0e36\u0e47", "\u0e2e\u0e33\u0e4d\u0e3a", "\u0e2d\u0e47\u0e39", "\u0e0d\u0e35\u0e4e\u0e3a", "\u0e06\u0e36\u0e48\u0e39", "\u0e29\u0e35\u0e4b\u0e3a", "\u0e22\u0e36\u0e49", "\u0e14\u0e31\u0e47", "\u0e1e\u0e31\u0e4a", "\u0e25\u0e36\u0e4b\u0e38", "\u0e02\u0e37\u0e4b", "\u0e1f\u0e35\u0e47\u0e3a", "\u0e1f\u0e34\u0e4a", "\u0e16\u0e31\u0e4e\u0e3a", "\u0e04\u0e49", "\u0e05\u0e4a", "\u0e1c\u0e36\u0e4d\u0e39", "\u0e19\u0e37\u0e4c\u0e39", "\u0e10\u0e31\u0e47\u0e3a", "\u0e0f\u0e4e", "\u0e12\u0e36\u0e48\u0e39", "\u0e18\u0e47\u0e38", "\u0e18\u0e49", "\u0e0a\u0e39", "\u0e1e\u0e34\u0e49", "\u0e27\u0e31\u0e4d", "\u0e03", "\u0e2d\u0e37\u0e48", "\u0e0f\u0e37\u0e4b\u0e3a", "\u0e12\u0e47\u0e38", "\u0e18\u0e34\u0e3a", "\u0e14\u0e33\u0e47", "\u0e1a\u0e37\u0e4a\u0e39", "\u0e16\u0e37\u0e4d\u0e38", "\u0e21\u0e37\u0e48", "\u0e1a\u0e34\u0e4b\u0e39", "\u0e02\u0e4b", "\u0e25\u0e34\u0e4a", "\u0e15\u0e34\u0e38", "\u0e1c\u0e34\u0e48\u0e39", "\u0e17\u0e31\u0e4d\u0e38", "\u0e17\u0e33\u0e4b", "\u0e25\u0e33\u0e48\u0e38", "\u0e07\u0e36\u0e4e\u0e38", "\u0e18\u0e31\u0e4d\u0e3a", "\u0e02\u0e34\u0e4c\u0e39", "\u0e07\u0e31\u0e48\u0e38", "\u0e1e\u0e31\u0e49\u0e39", "\u0e17\u0e35\u0e4b", "\u0e15\u0e33\u0e4e\u0e39", "\u0e2b\u0e31", "\u0e1c\u0e34\u0e48", "\u0e28\u0e34\u0e4b\u0e3a", "\u0e1e\u0e34\u0e48\u0e39", "\u0e1c\u0e34\u0e39", "\u0e1b\u0e34\u0e48\u0e38", "\u0e0b\u0e39", "\u0e19\u0e48\u0e38", "\u0e1c\u0e36\u0e4c\u0e3a", "\u0e11\u0e37\u0e4e", "\u0e2e\u0e31\u0e49\u0e38", "\u0e27\u0e48\u0e39", "\u0e17\u0e33\u0e4e\u0e3a", "\u0e0b\u0e48", "\u0e29\u0e31\u0e4d\u0e3a", "\u0e15\u0e31\u0e4a", "\u0e14\u0e31\u0e4a\u0e3a", "\u0e16\u0e33\u0e4c\u0e39", "\u0e08\u0e4d\u0e3a", "\u0e04\u0e35\u0e47\u0e3a", "\u0e20\u0e35\u0e4b\u0e39", "\u0e0e\u0e33\u0e4b\u0e39", "\u0e0a\u0e33\u0e49", "\u0e02\u0e37\u0e4d", "\u0e2e\u0e35\u0e47\u0e3a", "\u0e17\u0e34\u0e39", "\u0e08\u0e35\u0e4e\u0e3a", "\u0e28\u0e34\u0e4d\u0e39", "\u0e07\u0e36\u0e49", "\u0e2b\u0e37\u0e4a", "\u0e2a\u0e35\u0e4e\u0e39", "\u0e2c\u0e37\u0e49\u0e38", "\u0e12\u0e4a\u0e3a", "\u0e2d\u0e31\u0e4e\u0e39", "\u0e0b\u0e48\u0e39", "\u0e13\u0e33\u0e47\u0e38", "\u0e29\u0e33\u0e4a\u0e38", "\u0e12\u0e36\u0e49", "\u0e1e\u0e31\u0e4d", "\u0e1b\u0e47\u0e39", "\u0e20\u0e34\u0e4b\u0e39", "\u0e15\u0e37\u0e48\u0e38", "\u0e1e\u0e34\u0e4a\u0e39", "\u0e05\u0e34\u0e38", "\u0e20\u0e34\u0e4d\u0e3a", "\u0e03\u0e4b\u0e39", "\u0e1f\u0e37\u0e4c\u0e39", "\u0e11\u0e4b\u0e38", "\u0e15\u0e31\u0e4c", "\u0e25\u0e34\u0e48", "\u0e1b\u0e36\u0e47", "\u0e1b\u0e47\u0e38", "\u0e0e\u0e31\u0e38", "\u0e20\u0e31\u0e4c\u0e39", "\u0e23\u0e31\u0e4e\u0e3a", "\u0e12\u0e31\u0e4b\u0e38", "\u0e2d\u0e34\u0e4b\u0e39", "\u0e0e\u0e35\u0e4e\u0e3a", "\u0e19\u0e47", "\u0e1a\u0e35\u0e4a", "\u0e06\u0e34\u0e4e\u0e38", "\u0e23\u0e31\u0e3a", "\u0e1c\u0e36\u0e4c\u0e38", "\u0e16\u0e31\u0e4c\u0e39", "\u0e23\u0e35\u0e47\u0e39", "\u0e1e\u0e37\u0e4d", "\u0e2e\u0e37\u0e4d\u0e3a", "\u0e16\u0e36\u0e47", "\u0e04\u0e33\u0e4d\u0e39", "\u0e25\u0e35\u0e4a", "\u0e2b\u0e31\u0e48\u0e3a", "\u0e1f\u0e33\u0e48\u0e3a", "\u0e15\u0e31\u0e39", "\u0e07\u0e33\u0e4d\u0e39", "\u0e1b\u0e37\u0e49\u0e38", "\u0e0d\u0e31", "\u0e19\u0e37\u0e4e\u0e39", "\u0e2d\u0e33\u0e4d", "\u0e23\u0e36\u0e4c\u0e3a", "\u0e1f\u0e33\u0e4a\u0e39", "\u0e21\u0e47\u0e38", "\u0e23\u0e34\u0e4e\u0e38", "\u0e0f\u0e31\u0e3a", "\u0e1d\u0e31\u0e47\u0e39", "\u0e19\u0e33\u0e4a\u0e38", "\u0e2d\u0e34\u0e38", "\u0e01\u0e36\u0e4a\u0e3a", "\u0e01\u0e37\u0e48", "\u0e09\u0e33\u0e47\u0e38", "\u0e23\u0e31\u0e48\u0e38", "\u0e19\u0e31\u0e4a\u0e3a", "\u0e2d\u0e4e", "\u0e1d\u0e37", "\u0e0e\u0e33\u0e4d\u0e3a", "\u0e14\u0e39", "\u0e02\u0e36\u0e47\u0e3a", "\u0e1b\u0e31\u0e4d\u0e39", "\u0e15\u0e31\u0e4c\u0e38", "\u0e16\u0e48\u0e39", "\u0e1a\u0e35\u0e48", "\u0e1c\u0e33\u0e47\u0e38", "\u0e2b\u0e48\u0e3a", "\u0e06\u0e49\u0e38", "\u0e2a\u0e33\u0e49", "\u0e23\u0e36\u0e4a\u0e38", "\u0e25\u0e36\u0e4c\u0e3a", "\u0e0c\u0e35\u0e4b\u0e39", "\u0e23\u0e34\u0e3a", "\u0e17\u0e49\u0e3a", "\u0e29\u0e34\u0e47", "\u0e23\u0e48\u0e3a", "\u0e11\u0e37\u0e4b\u0e3a", "\u0e2c\u0e33\u0e4a\u0e3a", "\u0e0b\u0e36\u0e48\u0e3a", "\u0e06\u0e31\u0e4d\u0e39", "\u0e2e\u0e31\u0e4e\u0e39", "\u0e0d\u0e37\u0e4a\u0e3a", "\u0e25\u0e33\u0e4c\u0e38", "\u0e2a\u0e33\u0e47\u0e38", "\u0e1d\u0e4e\u0e39", "\u0e25\u0e34\u0e47\u0e38", "\u0e19\u0e4a\u0e38", "\u0e0a\u0e31\u0e47\u0e38", "\u0e0c\u0e36\u0e4c", "\u0e23\u0e49\u0e38", "\u0e2c\u0e36\u0e47\u0e39", "\u0e11\u0e33\u0e49", "\u0e1a\u0e31\u0e47", "\u0e09\u0e34\u0e4a\u0e3a", "\u0e1a\u0e31\u0e3a", "\u0e0b\u0e48\u0e3a", "\u0e1f\u0e36\u0e4e", "\u0e0b\u0e37\u0e48", "\u0e29\u0e36\u0e4b\u0e39", "\u0e0d\u0e4d\u0e38", "\u0e05\u0e35\u0e4d", "\u0e1c\u0e34\u0e4c\u0e38", "\u0e08\u0e34\u0e49", "\u0e04\u0e31\u0e4c\u0e39", "\u0e08\u0e34\u0e4a\u0e39", "\u0e03\u0e35\u0e48\u0e3a", "\u0e19\u0e33\u0e49", "\u0e0d\u0e37\u0e4d\u0e38", "\u0e21\u0e33\u0e48\u0e38", "\u0e0d\u0e34\u0e4b\u0e3a", "\u0e22\u0e35\u0e4b", "\u0e0f\u0e4e\u0e38", "\u0e28\u0e36\u0e4a\u0e39", "\u0e13\u0e33\u0e49\u0e3a", "\u0e21\u0e33\u0e4d\u0e39", "\u0e28\u0e38", "\u0e2d\u0e36\u0e4e", "\u0e13\u0e31\u0e3a", "\u0e29\u0e33\u0e4d\u0e38", "\u0e03\u0e4d\u0e3a", "\u0e19\u0e31\u0e48", "\u0e2b\u0e35\u0e4a", "\u0e1c\u0e31\u0e4c\u0e39", "\u0e0a\u0e37\u0e4c", "\u0e2c\u0e33\u0e47", "\u0e18\u0e31\u0e38", "\u0e13\u0e36\u0e4a\u0e3a", "\u0e2e\u0e31\u0e4d", "\u0e05\u0e31\u0e4e\u0e38", "\u0e01\u0e35\u0e4e\u0e3a", "\u0e23\u0e36\u0e4e\u0e3a", "\u0e0b\u0e34\u0e4c", "\u0e28\u0e33\u0e39", "\u0e15\u0e37\u0e4c\u0e3a", "\u0e03\u0e36\u0e4b\u0e38", "\u0e13\u0e34\u0e4d\u0e39", "\u0e2e\u0e31\u0e4d\u0e39", "\u0e06\u0e37\u0e49\u0e39", "\u0e02\u0e31\u0e4c", "\u0e25\u0e37\u0e3a", "\u0e1c\u0e35\u0e3a", "\u0e0f\u0e31\u0e48", "\u0e09\u0e37\u0e4e\u0e3a", "\u0e21\u0e33\u0e4c\u0e38", "\u0e2d\u0e36\u0e4e\u0e38", "\u0e21\u0e31\u0e4b\u0e39", "\u0e08\u0e35\u0e4c\u0e39", "\u0e25\u0e34\u0e39", "\u0e0e\u0e4b\u0e3a", "\u0e12\u0e35\u0e48", "\u0e13\u0e35\u0e49\u0e38", "\u0e2d\u0e4e\u0e39", "\u0e02\u0e36\u0e4c", "\u0e1c\u0e33\u0e4e\u0e39", "\u0e19\u0e33\u0e38", "\u0e02\u0e37\u0e48\u0e39", "\u0e20\u0e36\u0e4c\u0e3a", "\u0e1f\u0e31\u0e48\u0e3a", "\u0e19\u0e31\u0e4a\u0e39", "\u0e11\u0e35\u0e4d", "\u0e2e\u0e33\u0e4d", "\u0e1c\u0e36\u0e48\u0e3a", "\u0e1f\u0e37\u0e48\u0e38", "\u0e1f\u0e33\u0e4c\u0e3a", "\u0e0a\u0e4c\u0e3a", "\u0e2b\u0e34\u0e4c\u0e38", "\u0e17\u0e33\u0e4c\u0e39", "\u0e1d\u0e36\u0e4d\u0e38", "\u0e01\u0e37\u0e4b\u0e3a", "\u0e2d\u0e37\u0e48\u0e38", "\u0e2c\u0e35\u0e48", "\u0e1a\u0e36\u0e4c", "\u0e09\u0e33\u0e4d\u0e38", "\u0e10\u0e36\u0e3a", "\u0e25\u0e35\u0e48", "\u0e23\u0e34", "\u0e14\u0e35\u0e4a\u0e38", "\u0e04\u0e4c\u0e39", "\u0e20\u0e33\u0e4b", "\u0e04\u0e35\u0e4e", "\u0e0e\u0e4d\u0e39", "\u0e13\u0e4b\u0e39", "\u0e1d\u0e34\u0e4e\u0e3a", "\u0e2a\u0e34\u0e4c", "\u0e04\u0e34\u0e4e\u0e39", "\u0e2d\u0e35\u0e4d\u0e39", "\u0e12\u0e37\u0e38", "\u0e2d\u0e33\u0e48\u0e3a", "\u0e23\u0e34\u0e4b", "\u0e23\u0e36\u0e4d\u0e3a", "\u0e28\u0e35\u0e38", "\u0e0f\u0e34\u0e4b\u0e3a", "\u0e1f\u0e35\u0e48", "\u0e04\u0e35\u0e49\u0e3a", "\u0e23\u0e36\u0e49\u0e38", "\u0e1e\u0e36\u0e49\u0e39", "\u0e2c\u0e34", "\u0e2e\u0e31\u0e39", "\u0e07\u0e35\u0e4b\u0e38", "\u0e28\u0e35\u0e4b\u0e3a", "\u0e20\u0e31\u0e47\u0e3a", "\u0e22\u0e31\u0e4c\u0e39", "\u0e14\u0e35\u0e49\u0e38", "\u0e2c\u0e37\u0e4d\u0e39", "\u0e1e\u0e37\u0e47\u0e3a", "\u0e2e\u0e33\u0e47\u0e38", "\u0e1c\u0e31\u0e4c\u0e38", "\u0e2d\u0e4d\u0e39", "\u0e20\u0e34\u0e48", "\u0e14\u0e34\u0e4d\u0e39", "\u0e02\u0e33\u0e38", "\u0e03\u0e31\u0e4c", "\u0e09\u0e34\u0e49", "\u0e2c", "\u0e21\u0e48\u0e39", "\u0e2b\u0e47\u0e3a", "\u0e1b\u0e37", "\u0e25\u0e33\u0e48\u0e39", "\u0e07\u0e36\u0e48\u0e39", "\u0e17\u0e34\u0e47\u0e3a", "\u0e05\u0e31\u0e48\u0e39", "\u0e1e\u0e35\u0e49\u0e39", "\u0e27", "\u0e2c\u0e35\u0e4c\u0e39", "\u0e03\u0e35\u0e4e\u0e39", "\u0e03\u0e36\u0e47\u0e39", "\u0e28\u0e37\u0e4e\u0e3a", "\u0e2a\u0e31\u0e4e\u0e38", "\u0e05\u0e37", "\u0e0c\u0e36\u0e48\u0e3a", "\u0e07\u0e37\u0e4b", "\u0e09\u0e35\u0e47", "\u0e27\u0e33\u0e47\u0e39", "\u0e18\u0e4d\u0e3a", "\u0e1b\u0e31\u0e4b\u0e38", "\u0e2a\u0e33\u0e4e\u0e3a", "\u0e0e\u0e36\u0e3a", "\u0e23\u0e37\u0e39", "\u0e17\u0e31\u0e49", "\u0e16\u0e4e\u0e39", "\u0e0b\u0e34\u0e4d\u0e3a", "\u0e2b\u0e4a", "\u0e1e\u0e4a\u0e39", "\u0e0b\u0e37\u0e4d\u0e3a", "\u0e20\u0e37\u0e4c", "\u0e01\u0e36\u0e49\u0e39", "\u0e0a\u0e37\u0e4d", "\u0e0d\u0e34\u0e3a", "\u0e25\u0e35\u0e4a\u0e38", "\u0e22\u0e33\u0e4c\u0e3a", "\u0e0d\u0e35\u0e4a\u0e3a", "\u0e2a\u0e33\u0e49\u0e38", "\u0e1e\u0e31\u0e4b", "\u0e09\u0e37\u0e4a\u0e39", "\u0e27\u0e36\u0e4b\u0e3a", "\u0e1c\u0e4e", "\u0e20\u0e36\u0e4c", "\u0e0c\u0e33\u0e4c", "\u0e1f\u0e36\u0e4a", "\u0e02\u0e35\u0e48\u0e39", "\u0e23\u0e34\u0e4d\u0e3a", "\u0e1b\u0e31\u0e48\u0e3a", "\u0e0a\u0e34\u0e49\u0e38", "\u0e11\u0e36\u0e48\u0e39", "\u0e1d\u0e4b\u0e39", "\u0e04\u0e34\u0e38", "\u0e2b\u0e36\u0e4c\u0e39", "\u0e16\u0e36\u0e47\u0e39", "\u0e19\u0e34\u0e49\u0e39", "\u0e1d\u0e36\u0e47\u0e3a", "\u0e2a\u0e35\u0e4c\u0e39", "\u0e27\u0e36\u0e4a\u0e3a", "\u0e0e\u0e33\u0e4d", "\u0e0d\u0e34\u0e47\u0e3a", "\u0e18\u0e35\u0e49\u0e3a", "\u0e04\u0e31\u0e39", "\u0e0f\u0e37\u0e4d\u0e39", "\u0e02\u0e4c\u0e38", "\u0e2e\u0e33\u0e4a\u0e39", "\u0e14\u0e36\u0e47\u0e3a", "\u0e10\u0e35\u0e4e\u0e39", "\u0e23\u0e37\u0e4d", "\u0e02\u0e37\u0e49", "\u0e01\u0e36\u0e4e", "\u0e03\u0e35\u0e4e\u0e38", "\u0e25\u0e4d\u0e38", "\u0e15\u0e33\u0e47\u0e3a", "\u0e02\u0e33\u0e47\u0e3a", "\u0e1e\u0e37\u0e49\u0e39", "\u0e10\u0e37\u0e49\u0e3a", "\u0e12\u0e33\u0e4c", "\u0e04\u0e31\u0e48\u0e38", "\u0e27\u0e35\u0e47", "\u0e2b\u0e33\u0e4e\u0e3a", "\u0e2e\u0e35\u0e49\u0e39", "\u0e20\u0e37\u0e4b\u0e3a", "\u0e10\u0e35\u0e4c", "\u0e15\u0e37\u0e4b\u0e38", "\u0e05\u0e33\u0e4d\u0e3a", "\u0e0e\u0e36\u0e38", "\u0e2b\u0e34\u0e47\u0e39", "\u0e1f\u0e34\u0e4d", "\u0e02\u0e35\u0e49\u0e38", "\u0e18\u0e36\u0e49\u0e38", "\u0e17\u0e37\u0e49\u0e38", "\u0e28\u0e36\u0e4b\u0e38", "\u0e1d\u0e34\u0e49\u0e3a", "\u0e02\u0e31\u0e4d\u0e3a", "\u0e10\u0e35\u0e47\u0e39", "\u0e13\u0e4e", "\u0e09\u0e34\u0e4b\u0e3a", "\u0e06\u0e31\u0e39", "\u0e18\u0e34\u0e4b", "\u0e0a\u0e31\u0e4a\u0e3a", "\u0e15\u0e36\u0e4a\u0e38", "\u0e27\u0e31\u0e49\u0e38", "\u0e1b\u0e37\u0e48\u0e3a", "\u0e20\u0e36\u0e4b\u0e3a", "\u0e12\u0e33\u0e4b\u0e38", "\u0e15\u0e4d", "\u0e14\u0e35\u0e4a\u0e39", "\u0e25\u0e37\u0e4d\u0e3a", "\u0e1a\u0e31\u0e4e\u0e39", "\u0e08\u0e4b\u0e39", "\u0e19\u0e34\u0e4d\u0e39", "\u0e04\u0e36\u0e48\u0e3a", "\u0e07\u0e4e\u0e3a", "\u0e2b\u0e31\u0e4e\u0e39", "\u0e22\u0e36\u0e4e\u0e3a", "\u0e16\u0e35\u0e48\u0e39", "\u0e18\u0e34\u0e4a\u0e38", "\u0e2d\u0e4d\u0e38", "\u0e1b\u0e38", "\u0e15\u0e33\u0e4c\u0e38", "\u0e29\u0e35\u0e4e\u0e39", "\u0e28\u0e31\u0e48\u0e3a", "\u0e1e\u0e33\u0e47\u0e39", "\u0e02\u0e35\u0e3a", "\u0e2c\u0e35\u0e49\u0e39", "\u0e1d\u0e48", "\u0e27\u0e35\u0e4c\u0e38", "\u0e16\u0e33\u0e4d\u0e38", "\u0e1e\u0e35\u0e4e\u0e38", "\u0e2e\u0e35\u0e4c\u0e39", "\u0e10\u0e35\u0e38", "\u0e1d\u0e4d\u0e38", "\u0e20\u0e36\u0e4b\u0e38", "\u0e0b\u0e35\u0e49\u0e39", "\u0e0d\u0e34\u0e47", "\u0e01\u0e4e\u0e39", "\u0e12\u0e33\u0e4c\u0e39", "\u0e13\u0e36\u0e49\u0e38", "\u0e2e\u0e31\u0e4c\u0e3a", "\u0e2e\u0e36\u0e48\u0e38", "\u0e01\u0e37\u0e4c\u0e39", "\u0e28\u0e35\u0e4d\u0e38", "\u0e1e\u0e37\u0e4d\u0e39", "\u0e03\u0e4d\u0e38", "\u0e04\u0e33\u0e49\u0e39", "\u0e14\u0e37\u0e4e\u0e3a", "\u0e18\u0e37\u0e47\u0e3a", "\u0e13\u0e4e\u0e39", "\u0e27\u0e31\u0e48\u0e39", "\u0e20\u0e36\u0e4c\u0e38", "\u0e10\u0e33\u0e47\u0e39", "\u0e0b\u0e36\u0e4b\u0e3a", "\u0e27\u0e31\u0e49\u0e39", "\u0e09\u0e33\u0e4c\u0e3a", "\u0e21\u0e37\u0e4d\u0e39", "\u0e1e\u0e34\u0e4e\u0e38", "\u0e0b\u0e34\u0e49\u0e39", "\u0e05\u0e31\u0e4c\u0e3a", "\u0e04\u0e33\u0e4b", "\u0e18\u0e34\u0e4a\u0e39", "\u0e07\u0e34\u0e4b\u0e39", "\u0e10\u0e47\u0e3a", "\u0e12\u0e34\u0e4c\u0e3a", "\u0e03\u0e34\u0e4e\u0e39", "\u0e12\u0e31\u0e4d\u0e38", "\u0e21\u0e36\u0e4e", "\u0e23\u0e31\u0e39", "\u0e1e\u0e37\u0e48\u0e3a", "\u0e11\u0e37\u0e4a", "\u0e2e\u0e34\u0e4d\u0e3a", "\u0e19\u0e31\u0e47\u0e3a", "\u0e21\u0e33\u0e4d\u0e38", "\u0e25\u0e33\u0e4e\u0e39", "\u0e0d\u0e35\u0e4a\u0e38", "\u0e1e\u0e35\u0e4c\u0e3a", "\u0e07\u0e49", "\u0e0f\u0e33\u0e4b\u0e38", "\u0e2e\u0e37\u0e4e\u0e3a", "\u0e0c\u0e31\u0e48\u0e39", "\u0e0f\u0e33\u0e4e\u0e3a", "\u0e2a\u0e37\u0e4a", "\u0e13\u0e33\u0e4c\u0e39", "\u0e12\u0e33\u0e47\u0e3a", "\u0e12\u0e31\u0e4c", "\u0e1b\u0e36\u0e4a\u0e38", "\u0e02\u0e36\u0e48\u0e3a", "\u0e06\u0e36\u0e48\u0e38", "\u0e29\u0e35\u0e4d", "\u0e19\u0e37\u0e49\u0e39", "\u0e1e\u0e33\u0e4e", "\u0e13\u0e34\u0e4a\u0e3a", "\u0e08\u0e37\u0e4d\u0e3a", "\u0e23\u0e38", "\u0e27\u0e34\u0e49", "\u0e10\u0e34\u0e48\u0e3a", "\u0e12\u0e33\u0e4b", "\u0e0e\u0e36\u0e4a\u0e38", "\u0e0e\u0e4a\u0e3a", "\u0e22\u0e35\u0e49", "\u0e08\u0e34\u0e4a\u0e38", "\u0e08\u0e33\u0e3a", "\u0e09\u0e33\u0e49", "\u0e03\u0e33\u0e48\u0e38", "\u0e2b\u0e35\u0e4a\u0e38", "\u0e1c\u0e34\u0e48\u0e38", "\u0e1f\u0e31\u0e47\u0e39", "\u0e20\u0e35\u0e4a\u0e39", "\u0e1b\u0e4d\u0e39", "\u0e27\u0e34\u0e4b\u0e3a", "\u0e1e\u0e37\u0e47\u0e38", "\u0e1e\u0e35\u0e4c\u0e39", "\u0e1f\u0e37\u0e4b\u0e38", "\u0e19\u0e33\u0e48\u0e38", "\u0e06\u0e37\u0e4a\u0e39", "\u0e2d\u0e34\u0e4a\u0e39", "\u0e13\u0e33\u0e4b", "\u0e0d\u0e36\u0e4b\u0e39", "\u0e14\u0e35\u0e4b", "\u0e2b\u0e33\u0e47\u0e39", "\u0e18\u0e36\u0e4d\u0e38", "\u0e02\u0e34\u0e4d\u0e39", "\u0e02\u0e37\u0e47", "\u0e11\u0e48\u0e38", "\u0e2a\u0e34\u0e4b", "\u0e17\u0e36\u0e49\u0e39", "\u0e2d\u0e35\u0e4a\u0e38", "\u0e14\u0e34\u0e38", "\u0e20\u0e33\u0e49\u0e39", "\u0e27\u0e49", "\u0e02\u0e33\u0e48\u0e3a", "\u0e2c\u0e36\u0e4a\u0e38", "\u0e18\u0e31\u0e4e\u0e38", "\u0e2d\u0e34\u0e49\u0e39", "\u0e17\u0e34\u0e38", "\u0e10\u0e36\u0e4a\u0e39", "\u0e28\u0e33\u0e47\u0e38", "\u0e2e\u0e37\u0e4b", "\u0e22\u0e36\u0e39", "\u0e01\u0e3a", "\u0e13\u0e35\u0e47", "\u0e11\u0e48\u0e3a", "\u0e1a\u0e31\u0e4b", "\u0e2b\u0e37\u0e4d\u0e39", "\u0e06\u0e36\u0e4b\u0e3a", "\u0e0c\u0e36\u0e4e\u0e39", "\u0e09\u0e36\u0e4b\u0e38", "\u0e01\u0e31\u0e47\u0e3a", "\u0e1b\u0e35\u0e4b", "\u0e0b\u0e37\u0e4d\u0e38", "\u0e29\u0e36\u0e4b\u0e38", "\u0e2a\u0e33\u0e4e", "\u0e0d\u0e34\u0e4a\u0e39", "\u0e17\u0e35\u0e4e\u0e39", "\u0e16\u0e37\u0e49\u0e38", "\u0e0e\u0e34", "\u0e0f\u0e31\u0e4d\u0e39", "\u0e2c\u0e48\u0e39", "\u0e12\u0e31\u0e4a", "\u0e03\u0e35\u0e4a\u0e3a", "\u0e15\u0e33\u0e39", "\u0e02\u0e35\u0e4d\u0e39", "\u0e07\u0e36\u0e4c\u0e3a", "\u0e10\u0e34\u0e4c", "\u0e09\u0e34\u0e49\u0e39", "\u0e2b\u0e34\u0e3a", "\u0e09\u0e36\u0e4c\u0e3a", "\u0e14\u0e31\u0e4d\u0e3a", "\u0e23\u0e33\u0e4b\u0e39", "\u0e27\u0e36\u0e4a\u0e39", "\u0e0e\u0e31\u0e4e\u0e38", "\u0e2b\u0e35", "\u0e13\u0e35\u0e4c\u0e3a", "\u0e0f\u0e31\u0e4a\u0e3a", "\u0e18\u0e34", "\u0e2c\u0e31\u0e47\u0e38", "\u0e28\u0e36\u0e48\u0e3a", "\u0e19\u0e33\u0e4c", "\u0e0e\u0e33\u0e4b\u0e3a", "\u0e0f\u0e37\u0e48\u0e38", "\u0e0f", "\u0e2a\u0e47", "\u0e18\u0e35\u0e4d\u0e39", "\u0e22\u0e4a\u0e3a", "\u0e11\u0e33\u0e4b", "\u0e1c\u0e37\u0e4e\u0e3a", "\u0e0c\u0e31", "\u0e1f\u0e48\u0e38", "\u0e25\u0e34\u0e48\u0e39", "\u0e05\u0e36\u0e49\u0e38", "\u0e12\u0e37\u0e49\u0e38", "\u0e1a\u0e4e", "\u0e1e\u0e31\u0e4e\u0e39", "\u0e29\u0e4d\u0e39", "\u0e0a\u0e37\u0e49", "\u0e13\u0e35\u0e4c\u0e39", "\u0e17\u0e34\u0e4e\u0e39", "\u0e0c\u0e4b\u0e39", "\u0e20", "\u0e29\u0e37\u0e4e\u0e38", "\u0e0c\u0e47\u0e39", "\u0e2c\u0e35\u0e48\u0e39", "\u0e0c\u0e31\u0e47\u0e38", "\u0e10\u0e33\u0e4d\u0e38", "\u0e1c\u0e37\u0e48", "\u0e27\u0e47\u0e3a", "\u0e09\u0e33\u0e4a\u0e38", "\u0e0d\u0e33\u0e3a", "\u0e1e\u0e31\u0e47\u0e38", "\u0e20\u0e34\u0e39", "\u0e2d\u0e48\u0e39", "\u0e2c\u0e36\u0e4e\u0e38", "\u0e1d\u0e31\u0e47", "\u0e06\u0e33\u0e4e\u0e39", "\u0e29\u0e31\u0e4b\u0e38", "\u0e20\u0e34\u0e47\u0e38", "\u0e21\u0e34\u0e47\u0e38", "\u0e0b\u0e36\u0e4a", "\u0e19\u0e37\u0e47", "\u0e1e\u0e34\u0e4c", "\u0e1d\u0e35\u0e4e\u0e38", "\u0e12\u0e31\u0e4d\u0e39", "\u0e25\u0e33\u0e4d\u0e38", "\u0e0f\u0e36\u0e4c\u0e3a", "\u0e04\u0e33\u0e4e\u0e39", "\u0e1c\u0e35\u0e4b\u0e38", "\u0e02\u0e34\u0e4d\u0e38", "\u0e02\u0e36\u0e48\u0e38", "\u0e10\u0e36\u0e4c", "\u0e14\u0e37\u0e49", "\u0e19\u0e34\u0e4a\u0e39", "\u0e0a\u0e35\u0e38", "\u0e06\u0e37\u0e4a\u0e3a", "\u0e15\u0e33\u0e4e\u0e38", "\u0e2b\u0e33\u0e4b\u0e38", "\u0e0a\u0e49\u0e38", "\u0e29\u0e34\u0e4a\u0e39", "\u0e09\u0e36\u0e47", "\u0e03\u0e4c\u0e39", "\u0e20\u0e34\u0e4d\u0e39", "\u0e0f\u0e31\u0e4e", "\u0e1f\u0e36\u0e4c", "\u0e15\u0e34\u0e4d\u0e38", "\u0e0f\u0e36", "\u0e01\u0e31\u0e4c\u0e38", "\u0e14\u0e34\u0e3a", "\u0e1f\u0e31\u0e47\u0e3a", "\u0e0d\u0e48\u0e39", "\u0e02\u0e33\u0e49", "\u0e1e\u0e31\u0e4c\u0e39", "\u0e19\u0e4c", "\u0e1c\u0e36\u0e47\u0e39", "\u0e03\u0e31\u0e49", "\u0e12\u0e34\u0e4b", "\u0e08\u0e34\u0e3a", "\u0e1b\u0e33\u0e47\u0e39", "\u0e16\u0e37\u0e4b\u0e39", "\u0e2e\u0e34\u0e4e\u0e39", "\u0e1d\u0e31\u0e4d\u0e38", "\u0e16\u0e4d\u0e38", "\u0e0a\u0e36\u0e47\u0e3a", "\u0e19\u0e36\u0e4d\u0e38", "\u0e2b\u0e37\u0e49", "\u0e2e\u0e39", "\u0e16\u0e34\u0e48", "\u0e08\u0e36\u0e4e\u0e38", "\u0e22\u0e31\u0e4c\u0e38", "\u0e01\u0e33\u0e47\u0e39", "\u0e28\u0e34\u0e48\u0e3a", "\u0e2a\u0e31\u0e38", "\u0e01\u0e37\u0e4b\u0e38", "\u0e03\u0e33\u0e4d", "\u0e29\u0e33\u0e48\u0e39", "\u0e10\u0e34\u0e48\u0e39", "\u0e2b\u0e31\u0e4a\u0e38", "\u0e03\u0e36\u0e4a", "\u0e02\u0e36\u0e4b", "\u0e29\u0e35\u0e48", "\u0e17\u0e34\u0e47", "\u0e19\u0e34\u0e47", "\u0e2e\u0e35\u0e4a\u0e38", "\u0e21\u0e4a\u0e3a", "\u0e08\u0e35\u0e47\u0e38", "\u0e08\u0e36\u0e4b\u0e39", "\u0e27\u0e33\u0e49\u0e38", "\u0e03\u0e34\u0e48\u0e39", "\u0e28\u0e4e", "\u0e1f\u0e36\u0e39", "\u0e1b\u0e34\u0e38", "\u0e06\u0e31\u0e4e", "\u0e28\u0e36\u0e47\u0e39", "\u0e2e\u0e33\u0e4c\u0e38", "\u0e22\u0e37\u0e48", "\u0e14\u0e33\u0e49\u0e38", "\u0e11\u0e36\u0e4b", "\u0e18\u0e33\u0e4d\u0e3a", "\u0e27\u0e34\u0e49\u0e39", "\u0e25\u0e36\u0e4e\u0e39", "\u0e10\u0e37\u0e4b\u0e39", "\u0e11\u0e34\u0e4b\u0e38", "\u0e0b\u0e31\u0e4a\u0e3a", "\u0e08\u0e37", "\u0e18\u0e37\u0e49\u0e39", "\u0e1c\u0e35\u0e47\u0e39", "\u0e17\u0e36\u0e4e\u0e39", "\u0e23\u0e37\u0e48\u0e3a", "\u0e16\u0e34\u0e38", "\u0e01\u0e31\u0e4b", "\u0e25\u0e36\u0e47\u0e39", "\u0e0b\u0e4e\u0e3a", "\u0e1f\u0e36\u0e47", "\u0e19\u0e33", "\u0e08\u0e48\u0e3a", "\u0e04\u0e4a\u0e39", "\u0e20\u0e36\u0e4e", "\u0e03\u0e36\u0e4a\u0e39", "\u0e0f\u0e35\u0e4e\u0e38", "\u0e10\u0e31\u0e4d\u0e38", "\u0e29\u0e34\u0e49\u0e38", "\u0e15\u0e31\u0e4c\u0e39", "\u0e29\u0e37\u0e47", "\u0e10\u0e34\u0e4a\u0e39", "\u0e0c\u0e36\u0e49\u0e38", "\u0e0a\u0e31\u0e48", "\u0e18\u0e31\u0e4d", "\u0e2d\u0e34\u0e4e\u0e3a", "\u0e1d\u0e36\u0e4b\u0e39", "\u0e0c\u0e4d\u0e3a", "\u0e23\u0e31\u0e4c", "\u0e2c\u0e35\u0e4c\u0e3a", "\u0e16\u0e33\u0e4d", "\u0e29\u0e34\u0e4c\u0e38", "\u0e07\u0e31\u0e48\u0e39", "\u0e0a\u0e31\u0e4b", "\u0e0e\u0e37\u0e4e\u0e39", "\u0e09\u0e33\u0e48\u0e3a", "\u0e29\u0e35\u0e4d\u0e39", "\u0e0c\u0e31\u0e4e\u0e38", "\u0e29\u0e36\u0e49\u0e3a", "\u0e2d\u0e37\u0e38", "\u0e21\u0e31\u0e4c\u0e3a", "\u0e11\u0e3a", "\u0e20\u0e35\u0e47", "\u0e03\u0e35\u0e4b\u0e39", "\u0e01\u0e37\u0e4e\u0e38", "\u0e2e\u0e4d\u0e38", "\u0e1f\u0e34\u0e39", "\u0e08\u0e34\u0e4d\u0e38", "\u0e1c\u0e36\u0e4e\u0e39", "\u0e17\u0e36\u0e4c\u0e3a", "\u0e1e\u0e31\u0e4d\u0e3a", "\u0e20\u0e36\u0e48\u0e39", "\u0e0d\u0e34", "\u0e20\u0e37\u0e4a\u0e39", "\u0e21\u0e37\u0e49\u0e38", "\u0e1b\u0e35", "\u0e1a\u0e37\u0e4d\u0e39", "\u0e11\u0e31\u0e49\u0e3a", "\u0e08\u0e37\u0e49\u0e3a", "\u0e15\u0e34\u0e48\u0e39", "\u0e0c\u0e34\u0e4e", "\u0e01\u0e31\u0e4c\u0e3a", "\u0e1e\u0e34\u0e4c\u0e39", "\u0e04\u0e37\u0e4c", "\u0e03\u0e36\u0e47\u0e38", "\u0e23\u0e37\u0e4a", "\u0e25\u0e37\u0e4e\u0e3a", "\u0e2b\u0e33\u0e4b", "\u0e1f\u0e34\u0e48\u0e3a", "\u0e06\u0e33\u0e4b\u0e38", "\u0e09\u0e35\u0e4a\u0e38", "\u0e1c\u0e35\u0e48\u0e39", "\u0e11\u0e37\u0e48\u0e38", "\u0e0b\u0e3a", "\u0e1a\u0e36\u0e48", "\u0e14\u0e37\u0e49\u0e3a", "\u0e27\u0e4b", "\u0e16\u0e37\u0e47", "\u0e03\u0e36\u0e4c\u0e38", "\u0e27\u0e33\u0e4c\u0e39", "\u0e0b\u0e36\u0e4c\u0e3a", "\u0e2a\u0e48\u0e39", "\u0e04\u0e36\u0e4a\u0e39", "\u0e16\u0e33\u0e4a\u0e3a", "\u0e1b\u0e36\u0e47\u0e38", "\u0e1f\u0e35\u0e4e\u0e39", "\u0e29\u0e33\u0e4c\u0e3a", "\u0e17\u0e37\u0e4d", "\u0e08\u0e48\u0e38", "\u0e2b\u0e34\u0e47\u0e3a", "\u0e20\u0e33", "\u0e1b\u0e37\u0e4b\u0e3a", "\u0e03\u0e37", "\u0e04\u0e33\u0e48", "\u0e13\u0e35\u0e48", "\u0e1a\u0e35\u0e49\u0e39", "\u0e21\u0e37\u0e4c\u0e3a", "\u0e10\u0e31\u0e4c", "\u0e11\u0e4c\u0e3a", "\u0e22\u0e37\u0e38", "\u0e1c\u0e31\u0e4d", "\u0e2c\u0e36\u0e4d\u0e39", "\u0e0b\u0e33\u0e49", "\u0e15\u0e36\u0e4a\u0e39", "\u0e15\u0e33\u0e4c\u0e39", "\u0e18\u0e35\u0e38", "\u0e0e\u0e37\u0e3a", "\u0e25\u0e31\u0e4e\u0e3a", "\u0e2d\u0e4e\u0e3a", "\u0e17\u0e36\u0e49\u0e38", "\u0e2a\u0e4e\u0e38", "\u0e18\u0e35\u0e4e\u0e38", "\u0e2e\u0e37\u0e49\u0e39", "\u0e13\u0e36\u0e48\u0e38", "\u0e1d\u0e37\u0e47\u0e38", "\u0e02\u0e37\u0e4a\u0e38", "\u0e10\u0e35\u0e48\u0e39", "\u0e12\u0e35\u0e49\u0e3a", "\u0e0a\u0e34\u0e48\u0e3a", "\u0e07\u0e31\u0e4d\u0e39", "\u0e05\u0e33\u0e4e", "\u0e2c\u0e36\u0e47\u0e38", "\u0e14\u0e35\u0e3a", "\u0e0d\u0e33\u0e48\u0e38", "\u0e1f\u0e36\u0e4a\u0e3a", "\u0e18\u0e35\u0e48\u0e38", "\u0e1d\u0e34\u0e4b\u0e3a", "\u0e03\u0e33\u0e4a\u0e39", "\u0e23\u0e37\u0e47", "\u0e21\u0e31\u0e3a", "\u0e0b\u0e36\u0e49\u0e38", "\u0e08\u0e36\u0e48\u0e3a", "\u0e0c\u0e36\u0e4c\u0e38", "\u0e0c\u0e47\u0e3a", "\u0e11\u0e33\u0e48\u0e3a", "\u0e11\u0e31\u0e4c", "\u0e18\u0e36\u0e48\u0e39", "\u0e1a\u0e48\u0e39", "\u0e11\u0e39", "\u0e01\u0e4d\u0e3a", "\u0e08\u0e36", "\u0e08\u0e31\u0e47\u0e39", "\u0e0a\u0e31\u0e4e\u0e39", "\u0e05\u0e35\u0e4c\u0e3a", "\u0e11\u0e36\u0e39", "\u0e04\u0e33\u0e4c\u0e38", "\u0e04\u0e31\u0e49", "\u0e10\u0e4b", "\u0e1c\u0e47\u0e3a", "\u0e17\u0e34\u0e49\u0e38", "\u0e25\u0e31\u0e38", "\u0e25\u0e34\u0e49\u0e39", "\u0e2e\u0e35\u0e4b\u0e3a", "\u0e14\u0e33\u0e49", "\u0e0f\u0e36\u0e4b\u0e39", "\u0e22\u0e31\u0e47", "\u0e04\u0e31\u0e3a", "\u0e19\u0e31\u0e49\u0e3a", "\u0e13\u0e37", "\u0e2a\u0e35\u0e47\u0e38", "\u0e2d\u0e4b\u0e38", "\u0e09", "\u0e15\u0e31", "\u0e29\u0e35\u0e49\u0e3a", "\u0e1d\u0e4c\u0e3a", "\u0e04\u0e36\u0e47\u0e39", "\u0e17\u0e33\u0e4e\u0e39", "\u0e0d\u0e37\u0e4d", "\u0e1c\u0e33\u0e47\u0e3a", "\u0e20\u0e34\u0e48\u0e3a", "\u0e15\u0e35\u0e48\u0e3a", "\u0e0c\u0e31\u0e3a", "\u0e2a\u0e37\u0e49\u0e38", "\u0e2b\u0e34\u0e4d", "\u0e01\u0e33\u0e48\u0e38", "\u0e13\u0e31\u0e47\u0e39", "\u0e0c\u0e37\u0e4e\u0e38", "\u0e1a\u0e4c\u0e38", "\u0e08\u0e33\u0e49\u0e39", "\u0e2b\u0e49\u0e3a", "\u0e22\u0e47", "\u0e11\u0e36\u0e4c\u0e38", "\u0e14\u0e33\u0e38", "\u0e03\u0e37\u0e47\u0e39", "\u0e23\u0e48\u0e38", "\u0e0f\u0e48\u0e3a", "\u0e25\u0e33\u0e4c", "\u0e10\u0e37\u0e4d\u0e38", "\u0e10\u0e31\u0e49\u0e39", "\u0e29\u0e35\u0e48\u0e38", "\u0e1f\u0e31", "\u0e2b\u0e37\u0e4b", "\u0e1e\u0e34\u0e38", "\u0e20\u0e4a\u0e39", "\u0e0e\u0e33\u0e49", "\u0e17\u0e34\u0e4c\u0e38", "\u0e22\u0e37\u0e4d\u0e39", "\u0e2b\u0e36\u0e4a", "\u0e20\u0e33\u0e4d\u0e38", "\u0e0f\u0e34\u0e4b\u0e38", "\u0e02\u0e36\u0e4c\u0e3a", "\u0e1b\u0e33\u0e3a", "\u0e28\u0e34\u0e4d\u0e3a", "\u0e0a\u0e35\u0e3a", "\u0e20\u0e36\u0e38", "\u0e13\u0e33\u0e4a\u0e3a", "\u0e1b\u0e35\u0e47\u0e3a", "\u0e0c\u0e36\u0e4c\u0e39", "\u0e05\u0e35\u0e4c", "\u0e01\u0e31\u0e4b\u0e3a", "\u0e18\u0e4b\u0e39", "\u0e29\u0e31\u0e4a\u0e38", "\u0e1f\u0e37\u0e4c", "\u0e1c\u0e37\u0e48\u0e3a", "\u0e1c\u0e37\u0e4d\u0e3a", "\u0e02\u0e35\u0e39", "\u0e0c\u0e34\u0e49\u0e3a", "\u0e1b\u0e33\u0e4d", "\u0e27\u0e4a\u0e3a", "\u0e0a\u0e33\u0e4e", "\u0e11\u0e33\u0e4d\u0e38", "\u0e0f\u0e33\u0e47\u0e3a", "\u0e0e\u0e33\u0e4e", "\u0e1b\u0e31\u0e4e\u0e38", "\u0e2c\u0e47\u0e38", "\u0e0e\u0e33\u0e4b\u0e38", "\u0e27\u0e31\u0e4e\u0e39", "\u0e09\u0e35\u0e4d\u0e38", "\u0e18\u0e4e\u0e38", "\u0e0c\u0e31\u0e4a\u0e39", "\u0e22\u0e36\u0e47\u0e38", "\u0e10\u0e36\u0e4b", "\u0e25\u0e47\u0e38", "\u0e08\u0e33\u0e39", "\u0e1c\u0e37\u0e4d\u0e39", "\u0e0b\u0e4d\u0e3a", "\u0e16\u0e37\u0e47\u0e38", "\u0e17\u0e37\u0e4b\u0e3a", "\u0e29\u0e31\u0e48\u0e3a", "\u0e1b\u0e49", "\u0e2a\u0e34\u0e4a\u0e3a", "\u0e19\u0e36\u0e39", "\u0e13\u0e31\u0e4e\u0e3a", "\u0e04\u0e35\u0e38", "\u0e12\u0e35\u0e48\u0e39", "\u0e1c\u0e4d", "\u0e2c\u0e34\u0e4c\u0e39", "\u0e05\u0e35\u0e47\u0e39", "\u0e15\u0e35\u0e38", "\u0e11\u0e4b\u0e3a", "\u0e22\u0e34\u0e4e\u0e38", "\u0e20\u0e33\u0e4e\u0e3a", "\u0e17\u0e33\u0e4c", "\u0e1b\u0e4e\u0e38", "\u0e0e\u0e35\u0e4b\u0e39", "\u0e14\u0e34\u0e47", "\u0e28\u0e35\u0e4b\u0e39", "\u0e11\u0e4d\u0e39", "\u0e2d\u0e34\u0e4c\u0e39", "\u0e12\u0e36\u0e47", "\u0e0d\u0e33\u0e4e\u0e3a", "\u0e0a\u0e35\u0e4d\u0e38", "\u0e2a\u0e33\u0e4e\u0e38", "\u0e0b\u0e35\u0e49", "\u0e17\u0e34\u0e4b", "\u0e2b\u0e34\u0e4a\u0e3a", "\u0e01\u0e37\u0e39", "\u0e1d\u0e33\u0e4b\u0e38", "\u0e28\u0e33\u0e3a", "\u0e1f\u0e34\u0e49\u0e39", "\u0e2b\u0e31\u0e47", "\u0e01\u0e33\u0e4b\u0e38", "\u0e06\u0e37\u0e4a\u0e38", "\u0e22\u0e34\u0e4e\u0e3a", "\u0e10\u0e34\u0e4d", "\u0e28\u0e36\u0e4b\u0e39", "\u0e06\u0e31\u0e4a\u0e39", "\u0e13\u0e33\u0e49\u0e39", "\u0e18\u0e34\u0e4e\u0e38", "\u0e09\u0e31\u0e3a", "\u0e0a\u0e31\u0e49\u0e39", "\u0e2a\u0e35\u0e47\u0e39", "\u0e27\u0e37\u0e47", "\u0e28\u0e36\u0e4c", "\u0e2b\u0e36\u0e39", "\u0e05\u0e31\u0e4a\u0e39", "\u0e1e\u0e3a", "\u0e25\u0e31\u0e48\u0e39", "\u0e0a\u0e4e\u0e39", "\u0e27\u0e35\u0e4b", "\u0e0b\u0e31\u0e48\u0e38", "\u0e05\u0e35\u0e4b\u0e38", "\u0e11\u0e35\u0e4b", "\u0e05\u0e31\u0e4e\u0e3a", "\u0e0d\u0e36\u0e4a\u0e3a", "\u0e21\u0e37\u0e49\u0e39", "\u0e07\u0e33\u0e4b", "\u0e16\u0e31\u0e47\u0e38", "\u0e0b\u0e33\u0e4a", "\u0e12\u0e36\u0e4d\u0e3a", "\u0e05\u0e35\u0e48\u0e3a", "\u0e11\u0e36\u0e48\u0e38", "\u0e1c\u0e31\u0e4c\u0e3a", "\u0e07\u0e31\u0e4b\u0e3a", "\u0e1d\u0e37\u0e4b\u0e38", "\u0e13\u0e34\u0e4e\u0e38", "\u0e18\u0e33\u0e4a\u0e38", "\u0e1b\u0e33\u0e4a", "\u0e1b\u0e37\u0e4d\u0e39", "\u0e14\u0e35\u0e4a", "\u0e08\u0e33\u0e48\u0e38", "\u0e2e\u0e34\u0e3a", "\u0e12\u0e36\u0e4c\u0e38", "\u0e25\u0e37\u0e47\u0e3a", "\u0e0e\u0e35\u0e4d\u0e39", "\u0e22\u0e31\u0e4c\u0e3a", "\u0e2e\u0e34\u0e47\u0e38", "\u0e2b\u0e37\u0e4d\u0e3a", "\u0e0f\u0e36\u0e4c\u0e39", "\u0e0a\u0e34\u0e4a\u0e3a", "\u0e10\u0e34\u0e49\u0e38", "\u0e14\u0e31\u0e4c", "\u0e27\u0e4d\u0e3a", "\u0e1a\u0e36\u0e4a", "\u0e04\u0e37\u0e4b", "\u0e13\u0e37\u0e48\u0e39", "\u0e0e\u0e36\u0e49", "\u0e25\u0e4d\u0e3a", "\u0e16\u0e37\u0e4e\u0e3a", "\u0e20\u0e35\u0e39", "\u0e2b\u0e36\u0e47\u0e38", "\u0e0c\u0e37\u0e4a\u0e38", "\u0e05\u0e47\u0e38", "\u0e08\u0e36\u0e4d\u0e3a", "\u0e1b\u0e39", "\u0e18\u0e4e\u0e3a", "\u0e18\u0e31\u0e3a", "\u0e0d\u0e4a\u0e38", "\u0e25\u0e37\u0e47\u0e39", "\u0e28\u0e37\u0e4a\u0e3a", "\u0e19\u0e35\u0e48\u0e3a", "\u0e05\u0e37\u0e48\u0e3a", "\u0e13\u0e31\u0e4a", "\u0e06\u0e35\u0e38", "\u0e16\u0e4c\u0e39", "\u0e22\u0e33\u0e4b\u0e38", "\u0e0d\u0e31\u0e48\u0e38", "\u0e03\u0e31\u0e39", "\u0e22\u0e49", "\u0e09\u0e36\u0e4a\u0e39", "\u0e0a\u0e33\u0e4d", "\u0e0c\u0e31\u0e4a\u0e38", "\u0e25\u0e36\u0e47\u0e3a", "\u0e03\u0e31\u0e48\u0e39", "\u0e08\u0e31\u0e47", "\u0e21\u0e4a", "\u0e1f\u0e36\u0e48\u0e39", "\u0e09\u0e33\u0e4e\u0e3a", "\u0e12\u0e37\u0e48\u0e39", "\u0e28\u0e31\u0e4b\u0e3a", "\u0e2c\u0e31\u0e4a\u0e39", "\u0e1e\u0e36\u0e4a\u0e39", "\u0e2c\u0e37\u0e4e\u0e3a", "\u0e1f\u0e33\u0e47", "\u0e1f\u0e33\u0e4d\u0e3a", "\u0e13\u0e33\u0e4b\u0e38", "\u0e09\u0e33\u0e4c", "\u0e22\u0e34\u0e39", "\u0e16\u0e31\u0e4d\u0e39", "\u0e13\u0e35\u0e38", "\u0e1a\u0e38", "\u0e18\u0e31\u0e48\u0e3a", "\u0e1f\u0e47\u0e38", "\u0e10\u0e37\u0e4a\u0e38", "\u0e27\u0e35\u0e4b\u0e39", "\u0e05\u0e36\u0e49", "\u0e2a\u0e4b\u0e38", "\u0e07\u0e33\u0e39", "\u0e05\u0e33\u0e4a\u0e39", "\u0e0e\u0e36\u0e4b\u0e3a", "\u0e0c\u0e35", "\u0e21\u0e33\u0e4a", "\u0e07\u0e31\u0e4e", "\u0e22\u0e37\u0e4a\u0e39", "\u0e08\u0e33\u0e4d\u0e38", "\u0e1f\u0e4d\u0e39", "\u0e05\u0e33\u0e4a", "\u0e0a\u0e4e\u0e38", "\u0e10\u0e4a\u0e3a", "\u0e1b\u0e36\u0e49\u0e3a", "\u0e0c\u0e31\u0e48\u0e3a", "\u0e2a\u0e31\u0e4b\u0e39", "\u0e09\u0e34\u0e49\u0e3a", "\u0e10\u0e33\u0e4e", "\u0e05\u0e37\u0e4a\u0e39", "\u0e0b\u0e31\u0e49\u0e3a", "\u0e20\u0e34\u0e4e\u0e38", "\u0e0e\u0e33\u0e3a", "\u0e20\u0e4c\u0e38", "\u0e0b\u0e37\u0e39", "\u0e12\u0e34\u0e4c\u0e39", "\u0e27\u0e37\u0e4b", "\u0e28\u0e35\u0e49\u0e3a", "\u0e03\u0e4d", "\u0e02\u0e31\u0e4a\u0e3a", "\u0e2a\u0e36\u0e38", "\u0e08\u0e35\u0e4a\u0e39", "\u0e2d\u0e33\u0e4e\u0e38", "\u0e0c\u0e34\u0e48\u0e3a", "\u0e17\u0e37\u0e48\u0e3a", "\u0e1a\u0e37\u0e4a", "\u0e2b\u0e36\u0e4d\u0e38", "\u0e0a\u0e34\u0e4c\u0e3a", "\u0e15\u0e48", "\u0e1c\u0e48\u0e38", "\u0e2b\u0e34\u0e4a\u0e38", "\u0e2c\u0e33\u0e3a", "\u0e29\u0e4b\u0e38", "\u0e16\u0e33\u0e47\u0e38", "\u0e29\u0e31\u0e4b\u0e3a", "\u0e0b\u0e35\u0e4b\u0e39", "\u0e29\u0e36\u0e4b\u0e3a", "\u0e11\u0e31\u0e4b\u0e38", "\u0e0b\u0e37", "\u0e2b\u0e33\u0e49", "\u0e19\u0e31\u0e3a", "\u0e04\u0e34\u0e49\u0e39", "\u0e10\u0e49\u0e3a", "\u0e28\u0e35\u0e49\u0e39", "\u0e16\u0e35\u0e4d\u0e39", "\u0e04\u0e35", "\u0e12\u0e4e\u0e39", "\u0e1f\u0e35\u0e4b\u0e3a", "\u0e19\u0e36\u0e4b\u0e3a", "\u0e1b\u0e37\u0e4e", "\u0e02\u0e36\u0e39", "\u0e14\u0e34\u0e47\u0e38", "\u0e04\u0e33\u0e4e", "\u0e02\u0e34", "\u0e23\u0e36\u0e4d", "\u0e01\u0e37\u0e4d", "\u0e02\u0e34\u0e48\u0e38", "\u0e02\u0e33\u0e4b\u0e38", "\u0e18\u0e37\u0e39", "\u0e14\u0e35\u0e4e\u0e3a", "\u0e07\u0e33\u0e3a", "\u0e0b\u0e4d\u0e38", "\u0e0f\u0e31\u0e4d\u0e38", "\u0e17\u0e36", "\u0e21\u0e35\u0e4e\u0e38", "\u0e2d\u0e31\u0e4c", "\u0e04\u0e37\u0e4c\u0e39", "\u0e1b\u0e36\u0e49", "\u0e28\u0e36\u0e4c\u0e38", "\u0e1e\u0e33", "\u0e09\u0e34\u0e4c\u0e3a", "\u0e1a\u0e35\u0e38", "\u0e10\u0e4d\u0e3
Download .txt
gitextract_5udlx8oy/

├── .gitignore
├── LICENSE
├── NOTICE
├── README.md
├── cfgs/
│   ├── kor.yaml
│   └── thai.yaml
├── criterions.py
├── datasets/
│   ├── __init__.py
│   ├── data_utils.py
│   ├── fcdata.py
│   ├── kor_dataset.py
│   ├── kor_decompose.py
│   ├── nonpaired_dataset.py
│   ├── samplers.py
│   ├── thai_dataset.py
│   └── thai_decompose.py
├── evaluator.py
├── inference.py
├── logger.py
├── meta/
│   ├── kor-unrefined.json
│   ├── kor_split.json
│   └── thai_split.json
├── models/
│   ├── __init__.py
│   ├── aux_classifier.py
│   ├── comp_encoder.py
│   ├── decoder.py
│   ├── discriminator.py
│   ├── ma_core.py
│   ├── memory.py
│   └── modules/
│       ├── __init__.py
│       ├── blocks.py
│       ├── modules.py
│       └── self_attention.py
├── requirements.txt
├── scripts/
│   └── prepare_dataset.py
├── ssim.py
├── train.py
├── trainer.py
└── utils/
    ├── __init__.py
    ├── utils.py
    ├── visualize.py
    └── writer.py
Download .txt
SYMBOL INDEX (289 symbols across 29 files)

FILE: criterions.py
  function hinge_d_loss (line 9) | def hinge_d_loss(real, fake):
  function hinge_g_loss (line 13) | def hinge_g_loss(real, fake):

FILE: datasets/__init__.py
  function get_ma_dataset (line 15) | def get_ma_dataset(*args, language=None, **kwargs):
  function get_ma_val_dataset (line 24) | def get_ma_val_dataset(*args, language=None, **kwargs):

FILE: datasets/data_utils.py
  function cyclize (line 9) | def cyclize(loader):
  function rev_dict (line 16) | def rev_dict(l):
  function uniform_indices (line 21) | def uniform_indices(end, n_sample, st=None):
  function sample (line 33) | def sample(population, n_sample, exception=None):
  function uniform_sample (line 48) | def uniform_sample(population, n_sample, st=None):
  function get_fonts (line 64) | def get_fonts(avails):
  function get_union_chars (line 68) | def get_union_chars(avails):
  function get_fonts_unionchars (line 72) | def get_fonts_unionchars(avails):
  function get_intersection_chars (line 76) | def get_intersection_chars(avails):

FILE: datasets/fcdata.py
  class FCData (line 12) | class FCData:
    method get (line 16) | def get(self, font_name, char):
  class HDF5Data (line 20) | class HDF5Data(FCData):
    method __init__ (line 21) | def __init__(self, hdf5_paths, transform=None, language='kor'):
    method make_char2idx (line 53) | def make_char2idx(self, chars):
    method is_avail (line 77) | def is_avail(self, font_name, char):
    method get (line 83) | def get(self, font_name, char, default=None, transform=None):
    method get_from_reffont (line 103) | def get_from_reffont(self, char):
    method get_avail_chars (line 112) | def get_avail_chars(self, font_name):

FILE: datasets/kor_dataset.py
  class MAStyleFirstDataset (line 18) | class MAStyleFirstDataset(Dataset):
    method __init__ (line 22) | def __init__(self, data, style_sampler, n_sample_min=1, n_sample_max=999,
    method get_avail_chars (line 51) | def get_avail_chars(self, font_name, style_chars):
    method get_component_combinations (line 57) | def get_component_combinations(self, components, avail_chars, style_co...
    method check_and_sample (line 79) | def check_and_sample(self, trg_comp_ids):
    method __getitem__ (line 88) | def __getitem__(self, index):
    method __len__ (line 151) | def __len__(self):
    method collate_fn (line 155) | def collate_fn(batch):
  class MATargetFirstDataset (line 180) | class MATargetFirstDataset(Dataset):
    method __init__ (line 186) | def __init__(self, target_fc, style_avails, style_data, n_max_match=3,...
    method sample_style_char (line 224) | def sample_style_char(self, font_name, trg_char):
    method __getitem__ (line 256) | def __getitem__(self, index):
    method __len__ (line 291) | def __len__(self):
    method collate_fn (line 295) | def collate_fn(batch):
  function filter_complete_chars (line 316) | def filter_complete_chars(chars):
  function get_ma_dataset (line 320) | def get_ma_dataset(hdf5_data, avail_fonts, avail_chars=None, transform=N...
  function get_ma_val_dataset (line 338) | def get_ma_val_dataset(hdf5_data, fonts, chars, style_avails, n_max_matc...

FILE: datasets/kor_decompose.py
  function compose (line 23) | def compose(cho, jung, jong):
  function decompose (line 29) | def decompose(char):

FILE: datasets/nonpaired_dataset.py
  class EncodeDataset (line 13) | class EncodeDataset(Dataset):
    method __init__ (line 14) | def __init__(self, font_name, chars, data, language, style_id=0, trans...
    method __getitem__ (line 29) | def __getitem__(self, index):
    method __len__ (line 40) | def __len__(self):
  class DecodeDataset (line 44) | class DecodeDataset(Dataset):
    method __init__ (line 45) | def __init__(self, chars, language, style_id=0):
    method __getitem__ (line 63) | def __getitem__(self, index):
    method __len__ (line 72) | def __len__(self):

FILE: datasets/samplers.py
  class Sampler (line 10) | class Sampler:
    method __init__ (line 11) | def __init__(self, R, avails, data):
    method get_item (line 16) | def get_item(self, key, value):
    method get (line 19) | def get(self, key, ex_values=None, ret_values=False):
    method get_uniform (line 30) | def get_uniform(self, key, indices=None, st=None):
  class StyleSampler (line 45) | class StyleSampler(Sampler):
    method get_item (line 47) | def get_item(self, font_name, char):
  class ContentSampler (line 51) | class ContentSampler(Sampler):
    method get_item (line 53) | def get_item(self, char, font_name):

FILE: datasets/thai_dataset.py
  function product4_no_dup (line 15) | def product4_no_dup(consonants, uppers, highests, lowers):
  class MAStyleFirstDataset (line 29) | class MAStyleFirstDataset(Dataset):
    method __init__ (line 30) | def __init__(self, data, fonts, chars, n_sample_min, n_sample_max,
    method sample_style_chars (line 53) | def sample_style_chars(self, n_styles):
    method sample_trg_chars (line 78) | def sample_trg_chars(self, components, style_chars):
    method __getitem__ (line 97) | def __getitem__(self, index):
    method __len__ (line 141) | def __len__(self):
    method collate_fn (line 145) | def collate_fn(batch):
  class MATargetFirstDataset (line 170) | class MATargetFirstDataset(Dataset):
    method __init__ (line 171) | def __init__(self, target_fc, style_avails, style_data, n_max_match=4,...
    method sample_style_char (line 209) | def sample_style_char(self, font_name, trg_char):
    method __getitem__ (line 241) | def __getitem__(self, index):
    method __len__ (line 277) | def __len__(self):
    method collate_fn (line 281) | def collate_fn(batch):
  function get_ma_dataset (line 302) | def get_ma_dataset(hdf5_data, avail_fonts, avail_chars=None, transform=N...
  function get_ma_val_dataset (line 310) | def get_ma_val_dataset(hdf5_data, fonts, chars, style_avails, n_max_matc...

FILE: datasets/thai_decompose.py
  function _ord2idx (line 19) | def _ord2idx(ords):
  function compose (line 31) | def compose(consonant, upper, highest, lower):
  function compose_ids (line 41) | def compose_ids(consonant, upper, highest, lower):
  function complete_chars (line 51) | def complete_chars():
  function ord2idx_2d (line 64) | def ord2idx_2d(ords):
  function decompose_ords (line 83) | def decompose_ords(char):
  function decompose_ids (line 104) | def decompose_ids(char):
  function decompose_index (line 110) | def decompose_index(index):

FILE: evaluator.py
  function torch_eval (line 33) | def torch_eval(val_fn):
  class Evaluator (line 45) | class Evaluator:
    method __init__ (line 50) | def __init__(self, data, trn_avails, logger, writer, batch_size, trans...
    method validation (line 96) | def validation(self, gen, step, extra_tag=''):
    method comparable_validset_validation (line 113) | def comparable_validset_validation(self, gen, step, compare_inputs=Fal...
    method comparable_validation (line 123) | def comparable_validation(self, gen, style_avails, target_fonts, targe...
    method cross_validation (line 147) | def cross_validation(self, gen, step, loader, tag, n_batches, n_log=64...
    method get_pixel_losses (line 222) | def get_pixel_losses(self, out, trg_imgs, unify):
    method handwritten_validation_2stage (line 256) | def handwritten_validation_2stage(self, gen, step, fonts, style_chars,...
    method get_inputimages (line 299) | def get_inputimages(self, val_loader):
    method get_charimages (line 313) | def get_charimages(self, fonts, chars, empty_header=False, as_tensor=T...
    method merge_and_log_image (line 339) | def merge_and_log_image(self, name, out, target, step):
  function eval_ckpt (line 345) | def eval_ckpt():

FILE: inference.py
  function infer (line 12) | def infer(gen, loader):
  function get_val_loader (line 30) | def get_val_loader(data, fonts, chars, style_avails, transform, content_...
  function infer_2stage (line 42) | def infer_2stage(gen, encode_loader, decode_loader, reset_memory=True):
  function get_val_encode_loader (line 68) | def get_val_encode_loader(data, font_name, encode_chars, language, trans...
  function get_val_decode_loader (line 78) | def get_val_decode_loader(chars, language, B=32, num_workers=2, style_id...

FILE: logger.py
  class ColorFormatter (line 19) | class ColorFormatter(logging.Formatter):
    method format (line 28) | def format(self, record):
  class Logger (line 34) | class Logger(logging.Logger):
    method get (line 38) | def get(cls, file_path=None, level='info', colorize=True):
    method nofmt (line 76) | def nofmt(self, msg, *args, level='info', **kwargs):
    method remove_formats (line 82) | def remove_formats(self):
    method set_formats (line 91) | def set_formats(self, formatters):
    method set_file_handler (line 96) | def set_file_handler(self, file_path):

FILE: models/aux_classifier.py
  class AuxClassifier (line 11) | class AuxClassifier(nn.Module):
    method __init__ (line 12) | def __init__(self, C, C_out, norm='BN', activ='relu', pad_type='reflect',
    method forward (line 25) | def forward(self, x):

FILE: models/comp_encoder.py
  class ComponentEncoder (line 12) | class ComponentEncoder(nn.Module):
    method __init__ (line 16) | def __init__(self, C_in, C, norm='none', activ='relu', pad_type='refle...
    method forward (line 51) | def forward(self, x):
    method filter_skips (line 70) | def filter_skips(self, feats):

FILE: models/decoder.py
  class Integrator (line 12) | class Integrator(nn.Module):
    method __init__ (line 14) | def __init__(self, C, n_comps=3, norm='none', activ='none', C_in=None):
    method forward (line 19) | def forward(self, comps):
  class Decoder (line 30) | class Decoder(nn.Module):
    method __init__ (line 31) | def __init__(self, C, C_out, size, norm='IN', activ='relu', pad_type='...
    method forward (line 62) | def forward(self, comps, skips=None):

FILE: models/discriminator.py
  class MultitaskDiscriminator (line 12) | class MultitaskDiscriminator(nn.Module):
    method __init__ (line 13) | def __init__(self, C, n_fonts, n_chars, use_rx=True, w_norm='spectral'...
    method forward (line 23) | def forward(self, x, font_indices, char_indices):
  class Discriminator (line 51) | class Discriminator(nn.Module):
    method __init__ (line 52) | def __init__(self, C, n_fonts, n_chars, activ='relu', gap_activ='relu'...
    method forward (line 75) | def forward(self, x, font_indices, char_indices, out_feats=False):
    method use_rx (line 89) | def use_rx(self):

FILE: models/ma_core.py
  class MACore (line 12) | class MACore(nn.Module):
    method __init__ (line 14) | def __init__(self, C_in, C, C_out, comp_enc, dec, n_comps, n_comp_type...
    method reset_dynamic_memory (line 46) | def reset_dynamic_memory(self):
    method encode_write (line 51) | def encode_write(self, style_ids, comp_ids, style_imgs, reset_dynamic_...
    method read_decode (line 73) | def read_decode(self, target_style_ids, target_comp_ids):

FILE: models/memory.py
  function comp_id_to_addr (line 14) | def comp_id_to_addr(ids, language):
  class DynamicMemory (line 34) | class DynamicMemory(nn.Module):
    method __init__ (line 36) | def __init__(self):
    method write (line 41) | def write(self, style_ids, comp_addrs, comp_feats):
    method read (line 59) | def read(self, style_ids, comp_addrs, reduction='mean'):
    method write_point (line 81) | def write_point(self, style_id, comp_addr, data):
    method read_point (line 86) | def read_point(self, style_id, comp_addr, reduction='mean'):
    method reduce_features (line 91) | def reduce_features(self, feats, reduction='mean'):
    method reset (line 106) | def reset(self):
    method reset_batch (line 109) | def reset_batch(self, style_ids, comp_addrs):
    method reset_point (line 114) | def reset_point(self, style_id, comp_addr):
  class PersistentMemory (line 118) | class PersistentMemory(nn.Module):
    method __init__ (line 119) | def __init__(self, n_comps, mem_shape):
    method read (line 135) | def read(self, comp_addrs):
    method forward (line 140) | def forward(self, x, comp_addrs):
  class Memory (line 156) | class Memory(nn.Module):
    method __init__ (line 160) | def __init__(self, mem_shape, n_comps, persistent, language):
    method write (line 175) | def write(self, style_ids, comp_ids, comp_feats):
    method read (line 180) | def read(self, style_ids, comp_ids):
    method reset_style (line 194) | def reset_style(self, style_ids):
    method write_style (line 198) | def write_style(self, style_ids, style_codes):
    method read_style (line 202) | def read_style(self, style_ids):
    method get_style_addr (line 206) | def get_style_addr(self, N):
    method reset_dynamic (line 209) | def reset_dynamic(self):

FILE: models/modules/blocks.py
  class Flatten (line 13) | class Flatten(nn.Module):
    method __init__ (line 14) | def __init__(self, start_dim=1, end_dim=-1):
    method forward (line 19) | def forward(self, input):
  function dispatcher (line 23) | def dispatcher(dispatch_fn):
  function norm_dispatch (line 36) | def norm_dispatch(norm):
  function w_norm_dispatch (line 45) | def w_norm_dispatch(w_norm):
  function activ_dispatch (line 54) | def activ_dispatch(activ):
  function pad_dispatch (line 63) | def pad_dispatch(pad_type):
  class LinearBlock (line 71) | class LinearBlock(nn.Module):
    method __init__ (line 73) | def __init__(self, C_in, C_out, norm='none', activ='relu', bias=True, ...
    method forward (line 90) | def forward(self, x):
  class ConvBlock (line 98) | class ConvBlock(nn.Module):
    method __init__ (line 100) | def __init__(self, C_in, C_out, kernel_size=3, stride=1, padding=1, no...
    method forward (line 123) | def forward(self, x):
  class ResBlock (line 136) | class ResBlock(nn.Module):
    method __init__ (line 138) | def __init__(self, C_in, C_out, kernel_size=3, padding=1, upsample=Fal...
    method forward (line 157) | def forward(self, x):
  class Upsample1x1 (line 177) | class Upsample1x1(nn.Module):
    method __init__ (line 179) | def __init__(self, C_in, C_out, norm='none', activ='relu', w_norm='non...
    method forward (line 188) | def forward(self, x):
  class HourGlass (line 195) | class HourGlass(nn.Module):
    method __init__ (line 197) | def __init__(self, C_in, C_max, size, n_downs, n_mids=1, norm='none', ...
    method forward (line 235) | def forward(self, x):

FILE: models/modules/modules.py
  function split_dim (line 8) | def split_dim(x, dim, n_chunks):
  function weights_init (line 14) | def weights_init(init_type='default'):
  function spectral_norm (line 43) | def spectral_norm(module):

FILE: models/modules/self_attention.py
  class Attention (line 13) | class Attention(nn.Module):
    method __init__ (line 14) | def __init__(self, C_in_q, C_in_kv, C_qk, C_v, w_norm='none', scale=Fa...
    method forward (line 47) | def forward(self, x, y):
  class AttentionFFNBlock (line 84) | class AttentionFFNBlock(nn.Module):
    method __init__ (line 86) | def __init__(self, C_in_q, C_in_kv, C_qk, C_v, size, scale=True, norm=...
    method forward (line 108) | def forward(self, x, y):
  class SAFFNBlock (line 120) | class SAFFNBlock(AttentionFFNBlock):
    method __init__ (line 121) | def __init__(self, C, size, C_qk_ratio=0.25, scale=True, norm='ln', dr...
    method forward (line 135) | def forward(self, x):
  class GlobalContext (line 139) | class GlobalContext(nn.Module):
    method __init__ (line 141) | def __init__(self, C, bottleneck_ratio=0.25, w_norm='none'):
    method forward (line 153) | def forward(self, x):
  class GCBlock (line 163) | class GCBlock(nn.Module):
    method __init__ (line 165) | def __init__(self, C, bottleneck_ratio=0.25, w_norm='none'):
    method forward (line 169) | def forward(self, x):
  class RelativePositionalEmbedding2d (line 174) | class RelativePositionalEmbedding2d(nn.Module):
    method __init__ (line 178) | def __init__(self, emb_dim, H, W, down_kv=False):
    method rel_grid (line 191) | def rel_grid(self):
    method forward (line 216) | def forward(self, query):

FILE: scripts/prepare_dataset.py
  function get_code_points (line 29) | def get_code_points(language):
  function dump_to_hdf5 (line 39) | def dump_to_hdf5(dump_path, font_name, images, chars, compression=None):
  class FontProcessor (line 51) | class FontProcessor(object):
    method __init__ (line 52) | def __init__(self, language, resize_method="bilinear", font_size_facto...
    method ord (line 67) | def ord(self, char):
    method is_renderable_char (line 75) | def is_renderable_char(self, font, ch):
    method avail_chars (line 90) | def avail_chars(self, targetfontpath, pilfont):
    method get_charsize (line 97) | def get_charsize(self, char, font):
    method render_center_no_offset (line 104) | def render_center_no_offset(self, char, font, fontmaxsize, size=128, m...
    method dump_fonts (line 145) | def dump_fonts(self, fonts, dump_dir, compression=None):
    method fix_char_order_if_thai (line 211) | def fix_char_order_if_thai(self, char):
  function main (line 222) | def main(language, fonts_dir, meta_path, dump_dir):

FILE: ssim.py
  function gaussian (line 11) | def gaussian(window_size, sigma):
  function create_window (line 18) | def create_window(window_size, channel=1):
  function ssim (line 25) | def ssim(img1, img2, window_size=11, window=None, size_average=True, ful...
  function msssim (line 77) | def msssim(img1, img2, weights=None, window_size=11, window=None, size_a...
  class SSIM (line 111) | class SSIM(torch.nn.Module):
    method __init__ (line 112) | def __init__(self, window_size=11, size_average=True, val_range=None, ...
    method forward (line 122) | def forward(self, img1, img2):
  class MSSSIM (line 131) | class MSSSIM(torch.nn.Module):
    method __init__ (line 132) | def __init__(self, weights=None, window_size=11, size_average=True, va...
    method forward (line 147) | def forward(self, img1, img2):

FILE: train.py
  function get_dset_loader (line 30) | def get_dset_loader(data, avail_fonts, avail_chars, transform, shuffle, ...
  function get_val_dset_loader (line 46) | def get_val_dset_loader(data, avail_fonts, avail_chars, trn_avail_chars,...
  function setup_args_and_config (line 69) | def setup_args_and_config():
  function setup_language_dependent (line 105) | def setup_language_dependent(cfg):
  function setup_data (line 120) | def setup_data(cfg, val_transform):
  function setup_cv_dset_loader (line 136) | def setup_cv_dset_loader(hdf5_data, meta, val_transform, n_comp_types, c...
  function main (line 166) | def main():

FILE: trainer.py
  function has_bn (line 19) | def has_bn(model):
  function load_checkpoint (line 27) | def load_checkpoint(path, gen, disc, aux_clf, g_optim, d_optim, ac_optim):
  class Trainer (line 47) | class Trainer:
    method __init__ (line 48) | def __init__(self, gen, disc, g_optim, d_optim, aux_clf, ac_optim,
    method clear_losses (line 69) | def clear_losses(self):
    method accum_g (line 85) | def accum_g(self, decay=0.999):
    method sync_g_ema (line 92) | def sync_g_ema(self, style_ids, style_comp_ids, style_imgs, trg_ids, t...
    method train (line 101) | def train(self, loader, st_step=1, val=None):
    method add_pixel_loss (line 240) | def add_pixel_loss(self, out, target):
    method add_gan_g_loss (line 246) | def add_gan_g_loss(self, real, real_font, real_char, fake, fake_font, ...
    method add_gan_d_loss (line 260) | def add_gan_d_loss(self, real, real_font, real_char, fake, fake_font, ...
    method add_fm_loss (line 274) | def add_fm_loss(self, real_feats, fake_feats):
    method add_ac_losses_and_update_stats (line 287) | def add_ac_losses_and_update_stats(self, comp_feats, style_comp_ids, g...
    method infer_ac (line 305) | def infer_ac(self, comp_feats, comp_ids):
    method d_backward (line 319) | def d_backward(self):
    method g_backward (line 324) | def g_backward(self):
    method ac_backward (line 329) | def ac_backward(self, retain_graph):
    method save (line 344) | def save(self, cur_loss, method, save_freq=None):
    method plot (line 401) | def plot(self, losses, discs, stats):
    method log (line 439) | def log(self, losses, discs, stats):

FILE: utils/utils.py
  class AverageMeter (line 13) | class AverageMeter():
    method __init__ (line 15) | def __init__(self):
    method reset (line 18) | def reset(self):
    method update (line 25) | def update(self, val, n=1):
    method __repr__ (line 32) | def __repr__(self):
  class AverageMeters (line 36) | class AverageMeters():
    method __init__ (line 37) | def __init__(self, *keys):
    method resets (line 42) | def resets(self):
    method updates (line 46) | def updates(self, dic, n=1):
    method __repr__ (line 50) | def __repr__(self):
  function accuracy (line 54) | def accuracy(out, target):
  function temporary_freeze (line 64) | def temporary_freeze(module):
  function freeze (line 70) | def freeze(module):
  function unfreeze (line 83) | def unfreeze(module, org=None):
  function makedirs (line 95) | def makedirs(path):
  function rm (line 104) | def rm(path):
  function cp (line 112) | def cp(src, dst):
  function timestamp (line 116) | def timestamp(fmt="%y%m%d_%H-%M-%S"):

FILE: utils/visualize.py
  function make_merged_grid (line 11) | def make_merged_grid(batchs, merge_dim, **kwargs):
  function make_comparable_grid (line 30) | def make_comparable_grid(*batches, nrow):
  function normalize (line 48) | def normalize(tensor, eps=1e-5):
  function to_grid (line 57) | def to_grid(tensor, to, **kwargs):
  function save_tensor_to_image (line 82) | def save_tensor_to_image(tensor, filepath, scale=None):
  function textboxes (line 97) | def textboxes(chars, data):

FILE: utils/writer.py
  class Writer (line 11) | class Writer:
    method add_scalars (line 12) | def add_scalars(self, tag_scalar_dic, global_step):
    method add_image (line 15) | def add_image(self, tag, img_tensor, global_step):
  class DiskWriter (line 19) | class DiskWriter(Writer):
    method __init__ (line 20) | def __init__(self, img_path, scale=None):
    method add_scalars (line 25) | def add_scalars(self, tag_scalar_dic, global_step):
    method add_image (line 28) | def add_image(self, tag, img_tensor, global_step):
  class TBWriter (line 33) | class TBWriter(Writer):
    method __init__ (line 34) | def __init__(self, dir_path, scale=None):
    method add_scalars (line 39) | def add_scalars(self, tag_scalar_dic, global_step):
    method add_image (line 43) | def add_image(self, tag, img_tensor, global_step):
  class TBDiskWriter (line 52) | class TBDiskWriter(TBWriter):
    method __init__ (line 53) | def __init__(self, dir_path, img_path, scale=None):
    method add_image (line 58) | def add_image(self, tag, img_tensor, global_step):
Condensed preview — 42 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (561K chars).
[
  {
    "path": ".gitignore",
    "chars": 184,
    "preview": "*.pkl\n.ipynb_checkpoints\n*.ipynb\n*.png\nbackups/\nruns/\n__pycache__/\n*.swp\ncheckpoints/\nlogs/\nruns-back/\n*.log\n*.sh\ntags*\n"
  },
  {
    "path": "LICENSE",
    "chars": 1067,
    "preview": "Copyright (c) 2020-present NAVER Corp.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\nof"
  },
  {
    "path": "NOTICE",
    "chars": 21035,
    "preview": "DMFont\nCopyright (c) 2020-present NAVER Corp.\n\nPermission is hereby granted, free of charge, to any person obtaining a c"
  },
  {
    "path": "README.md",
    "chars": 6020,
    "preview": "## Few-shot Compositional Font Generation with Dual Memory (ECCV'20)\n\n**NOTICE: We release the unified few-shot font gen"
  },
  {
    "path": "cfgs/kor.yaml",
    "chars": 860,
    "preview": "# train\ndata_dir: data/fonts-hdf5\ndata_meta: meta/kor_split.json\nlanguage: kor\nbatch_size: 12\nmax_iter: 200000\nseed: 2\ng"
  },
  {
    "path": "cfgs/thai.yaml",
    "chars": 132,
    "preview": "data_dir: data/thai-hdf5-fix2\ndata_meta: meta/thai_split.json\nlanguage: thai\n\ng_lr: 5e-5\nd_lr: 1e-4\nmax_iter: 250000\nbat"
  },
  {
    "path": "criterions.py",
    "chars": 249,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nimport torch.nn.functional as F\n\n\ndef hinge_d_loss(rea"
  },
  {
    "path": "datasets/__init__.py",
    "chars": 837,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nfrom . import kor_dataset\nfrom . import thai_dataset\nf"
  },
  {
    "path": "datasets/data_utils.py",
    "chars": 2068,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nimport numpy as np\n\n\ndef cyclize(loader):\n    \"\"\" Cycl"
  },
  {
    "path": "datasets/fcdata.py",
    "chars": 3127,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nimport h5py as h5\nfrom torchvision import transforms\n\n"
  },
  {
    "path": "datasets/kor_dataset.py",
    "chars": 12340,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nimport random\nfrom itertools import product\n\nimport nu"
  },
  {
    "path": "datasets/kor_decompose.py",
    "chars": 1636,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nCOMPONENT_RANGE = (int('3131', 16), int('3163', 16))  "
  },
  {
    "path": "datasets/nonpaired_dataset.py",
    "chars": 1903,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nimport torch\nfrom torch.utils.data import Dataset\n\nfro"
  },
  {
    "path": "datasets/samplers.py",
    "chars": 1500,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nimport torch\nfrom .data_utils import sample, uniform_i"
  },
  {
    "path": "datasets/thai_dataset.py",
    "chars": 10864,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nimport random\nimport numpy as np\nimport torch\nfrom tor"
  },
  {
    "path": "datasets/thai_decompose.py",
    "chars": 3301,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nfrom .data_utils import rev_dict\n\nCONSONANTS = [3585, "
  },
  {
    "path": "evaluator.py",
    "chars": 18233,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nfrom itertools import chain\nfrom pathlib import Path\ni"
  },
  {
    "path": "inference.py",
    "chars": 2704,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nimport torch\nfrom torch.utils.data import DataLoader\nf"
  },
  {
    "path": "logger.py",
    "chars": 3109,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nimport sys\nimport logging\n\n\nlog_lv = {\n    'critical':"
  },
  {
    "path": "meta/kor-unrefined.json",
    "chars": 2729,
    "preview": "{\"target_chars\": \"\\uac00\\uace0\\uacfe\\uad18\\uad53\\uadf8\\uae68\\uaf86\\uaf9c\\ub044\\ub04c\\ub0d0\\ub0f5\\ub1cc\\ub204\\ub247\\ub290"
  },
  {
    "path": "meta/kor_split.json",
    "chars": 26344,
    "preview": "{\"train\": {\"fonts\": [\"UhBee Rami.ttf\", \"UhBee DoolDool.ttf\", \"UhBee ddolyoung.ttf\", \"UhBee Jisyuk jisyuk.ttf\", \"UhBee My"
  },
  {
    "path": "meta/thai_split.json",
    "chars": 279525,
    "preview": "{\"train\": {\"fonts\": [\"KaniGa-Regular.ttf\", \"Aksaramatee-Regular.ttf\", \"JS-Karabow.ttf\", \"Purisa-Medium.ttf\", \"Nakaracha-"
  },
  {
    "path": "models/__init__.py",
    "chars": 177,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nfrom .ma_core import MACore\nfrom .discriminator import"
  },
  {
    "path": "models/aux_classifier.py",
    "chars": 819,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nfrom functools import partial\nimport torch.nn as nn\nfr"
  },
  {
    "path": "models/comp_encoder.py",
    "chars": 2399,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nfrom functools import partial\nimport torch.nn as nn\nim"
  },
  {
    "path": "models/decoder.py",
    "chars": 2661,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nfrom functools import partial\nimport torch\nimport torc"
  },
  {
    "path": "models/discriminator.py",
    "chars": 2988,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nfrom functools import partial\nimport torch\nimport torc"
  },
  {
    "path": "models/ma_core.py",
    "chars": 3250,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nimport torch.nn as nn\nfrom .comp_encoder import Compon"
  },
  {
    "path": "models/memory.py",
    "chars": 6811,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nimport numpy as np\nimport torch\nimport torch.nn as nn\n"
  },
  {
    "path": "models/modules/__init__.py",
    "chars": 141,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nfrom .modules import *\nfrom .blocks import *\nfrom .sel"
  },
  {
    "path": "models/modules/blocks.py",
    "chars": 7426,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nfrom functools import partial\nimport torch\nimport torc"
  },
  {
    "path": "models/modules/modules.py",
    "chars": 1656,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\n\"\"\"\nimport torch.nn as nn\n\n\ndef split_dim(x, dim, n_chunks):\n    shape"
  },
  {
    "path": "models/modules/self_attention.py",
    "chars": 7210,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nimport torch\nimport torch.nn as nn\nimport torch.nn.fun"
  },
  {
    "path": "requirements.txt",
    "chars": 165,
    "preview": "torch==1.1.0\ntorchvision==0.2.2\nh5py==2.9.0\nnumpy==1.17.2\nPillow==6.2.0\nsconf==0.2.1\ntqdm==4.47.0\ntensorboard==2.0.0\nten"
  },
  {
    "path": "scripts/prepare_dataset.py",
    "chars": 8818,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nimport os\nimport json\nfrom itertools import chain\nfrom"
  },
  {
    "path": "ssim.py",
    "chars": 5041,
    "preview": "from math import exp\nimport torch\nimport torch.nn.functional as F\n\n\n####################################################"
  },
  {
    "path": "train.py",
    "chars": 11527,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nimport sys\nimport json\nfrom pathlib import Path\nimport"
  },
  {
    "path": "trainer.py",
    "chars": 16094,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nimport copy\nfrom pathlib import Path\n\nimport torch\nimp"
  },
  {
    "path": "utils/__init__.py",
    "chars": 134,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nfrom .utils import *\nfrom .visualize import *\nfrom .wr"
  },
  {
    "path": "utils/utils.py",
    "chars": 2423,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nimport os\nimport shutil\nfrom contextlib import context"
  },
  {
    "path": "utils/visualize.py",
    "chars": 2657,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nimport torch\nfrom torchvision import utils as tv_utils"
  },
  {
    "path": "utils/writer.py",
    "chars": 1838,
    "preview": "\"\"\"\nDMFont\nCopyright (c) 2020-present NAVER Corp.\nMIT license\n\"\"\"\nfrom pathlib import Path\nimport torch.nn.functional as"
  }
]

About this extraction

This page contains the full source code of the clovaai/dmfont GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 42 files (472.7 KB), approximately 248.5k tokens, and a symbol index with 289 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!