static void modified() {
   try (FileWriter writer = new FileWriter(getFile())) {
     JsonObject obj = deepCopy(INSTANCE.everythingElse);
     obj.addProperty("clientToken", INSTANCE.clientToken);
     obj.add("authenticationDatabase", GSON.toJsonTree(INSTANCE.authenticationDatabase.profiles));
     GSON.toJson(obj, writer);
     System.out.println("Profiles saved");
   } catch (IOException e) {
     e.printStackTrace();
   }
 }
 public static LauncherProfiles load() throws IOException {
   System.out.println("Loading Minecraft profiles from " + DevLauncher.workingDirectory);
   try (FileReader reader = new FileReader(getFile())) {
     LauncherProfiles profiles = new LauncherProfiles();
     JsonObject e = new JsonParser().parse(reader).getAsJsonObject();
     for (Map.Entry<String, JsonElement> entry : e.entrySet()) {
       if (entry.getKey().equals("clientToken")) {
         profiles.clientToken = entry.getValue().getAsString();
       } else if (entry.getKey().equals("authenticationDatabase")) {
         JsonObject o = entry.getValue().getAsJsonObject();
         for (Map.Entry<String, JsonElement> entry1 : o.entrySet()) {
           profiles.authenticationDatabase.profiles.put(
               UUIDTypeAdapter.fromString(entry1.getKey()),
               GSON.fromJson(entry1.getValue(), OnlineProfile.class));
         }
       } else {
         profiles.everythingElse.add(entry.getKey(), entry.getValue());
       }
     }
     INSTANCE = profiles;
     return INSTANCE;
   } finally {
     if (INSTANCE == null) {
       INSTANCE = new LauncherProfiles();
     }
     INSTANCE.markLoaded();
   }
 }
  public void load() throws IOException {
    File file = getFile();
    if (file.exists()) {
      JsonObject rootObject = JSON_PARSER.parse(new FileReader(file)).getAsJsonObject();

      for (JsonElement element : rootObject.getAsJsonArray("players")) {
        Player player = new Player(element.getAsJsonObject());
        playerDB.put(player.getName(), player);
      }

      for (JsonElement element : rootObject.getAsJsonArray("groups")) {
        Group group = new Group(element.getAsJsonObject());
        groupDB.put(group.getName(), group);
      }
    } else {
      //noinspection ResultOfMethodCallIgnored
      file.createNewFile();
      JsonObject rootObject = new JsonObject();
      rootObject.add("players", new JsonArray());
      rootObject.add("groups", new JsonArray());
      BufferedWriter bw = new BufferedWriter(new FileWriter(file));
      bw.write(GSON.toJson(rootObject));
      bw.close();
    }
  }
    @Override
    // 1.data 통신
    public ArrayList<String> call() throws Exception {
      JSONResultString result = null;
      ArrayList<String> arrayList1 = new ArrayList<String>();
      try {

        HttpRequest request = post("http://192.168.0.5:8088/bitin/api/class/start-attd ");

        // reiquest 설정
        request.connectTimeout(2000).readTimeout(2000);
        // JSON  포맷으로 보내기  => POST 방식
        request.acceptCharset("UTF-8");
        request.acceptJson();
        request.accept(HttpRequest.CONTENT_TYPE_JSON);
        request.contentType("application/json", "UTF-8");

        // 데이터 세팅
        JSONObject params1 = new JSONObject();
        params1.put("classNo", classNo);
        params1.put("startTime", endTime);
        params1.put("timer", count_timer);

        Log.d("JoinData-->", params1.toString());
        request.send(params1.toString());

        // 3. 요청
        int responseCode = request.code();
        if (HttpURLConnection.HTTP_OK != responseCode) {
          Log.e("HTTP fail-->", "Http Response Fail:" + responseCode);
          return null;
        } else {
          Log.e("HTTPRequest-->", "정상");
        }

        // 4. JSON 파싱
        Reader reader = request.bufferedReader();
        // Log.d("Reader",reader);
        result = GSON.fromJson(reader, JSONResultString.class);
        reader.close();

        // 5. 사용하기
        Log.d("---> ResponseResult-->", result.getResult()); // "success"? or "fail"?
        Log.d("--->Data-->", result.getData().toString());

        return result.getData();

      } catch (Exception e3) {
        e3.printStackTrace();
      }
      return result.getData();
    }
  public void save() {
    try {
      File file = getFile();
      if (!file.exists()) // noinspection ResultOfMethodCallIgnored
      file.createNewFile();
      JsonObject rootObject = new JsonObject();

      JsonArray players = new JsonArray();
      for (Player player : playerDB.values()) players.add(player.toJson());
      rootObject.add("players", players);

      JsonArray groups = new JsonArray();
      for (Group group : groupDB.values()) groups.add(group.toJson());
      rootObject.add("groups", groups);

      BufferedWriter bw = new BufferedWriter(new FileWriter(file));
      bw.write(GSON.toJson(rootObject));
      bw.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  public static ByteArrayOutputStream requestsToZip(
      ServletContext context,
      String globalTitle,
      Date generationDate,
      ScrambleRequest[] scrambleRequests,
      String password,
      String generationUrl)
      throws IOException, DocumentException, ZipException {
    ByteArrayOutputStream baosZip = new ByteArrayOutputStream();

    ZipParameters parameters = new ZipParameters();
    parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
    parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
    if (password != null) {
      parameters.setEncryptFiles(true);
      parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
      parameters.setPassword(password);
    }
    parameters.setSourceExternalStream(true);

    ZipOutputStream zipOut = new ZipOutputStream(baosZip);
    HashMap<String, Boolean> seenTitles = new HashMap<String, Boolean>();
    for (ScrambleRequest scrambleRequest : scrambleRequests) {
      String safeTitle = toFileSafeString(scrambleRequest.title);
      int salt = 0;
      String tempNewSafeTitle = safeTitle;
      while (seenTitles.get(tempNewSafeTitle) != null) {
        tempNewSafeTitle = safeTitle + " (" + (++salt) + ")";
      }
      safeTitle = tempNewSafeTitle;
      seenTitles.put(safeTitle, true);

      String pdfFileName = "pdf/" + safeTitle + ".pdf";
      parameters.setFileNameInZip(pdfFileName);
      zipOut.putNextEntry(null, parameters);

      PdfReader pdfReader = createPdf(globalTitle, generationDate, scrambleRequest);
      byte[] b = new byte[(int) pdfReader.getFileLength()];
      pdfReader.getSafeFile().readFully(b);
      zipOut.write(b);

      zipOut.closeEntry();

      String txtFileName = "txt/" + safeTitle + ".txt";
      parameters.setFileNameInZip(txtFileName);
      zipOut.putNextEntry(null, parameters);
      zipOut.write(join(stripNewlines(scrambleRequest.getAllScrambles()), "\r\n").getBytes());
      zipOut.closeEntry();
    }

    String safeGlobalTitle = toFileSafeString(globalTitle);
    String jsonFileName = safeGlobalTitle + ".json";
    parameters.setFileNameInZip(jsonFileName);
    zipOut.putNextEntry(null, parameters);
    HashMap<String, Object> jsonObj = new HashMap<String, Object>();
    jsonObj.put("sheets", scrambleRequests);
    jsonObj.put("competitionName", globalTitle);
    jsonObj.put("version", Utils.getProjectName() + "-" + Utils.getVersion());
    jsonObj.put("generationDate", generationDate);
    jsonObj.put("generationUrl", generationUrl);
    String json = GSON.toJson(jsonObj);
    zipOut.write(json.getBytes());
    zipOut.closeEntry();

    String jsonpFileName = safeGlobalTitle + ".jsonp";
    parameters.setFileNameInZip(jsonpFileName);
    zipOut.putNextEntry(null, parameters);
    String jsonp = "var SCRAMBLES_JSON = " + json + ";";
    zipOut.write(jsonp.getBytes());
    zipOut.closeEntry();

    parameters.setFileNameInZip(safeGlobalTitle + ".html");
    zipOut.putNextEntry(null, parameters);

    InputStream is = context.getResourceAsStream(HTML_SCRAMBLE_VIEWER);
    BufferedReader in = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();
    String line;
    while ((line = in.readLine()) != null) {
      line = line.replaceAll("%SCRAMBLES_JSONP_FILENAME%", jsonpFileName);
      sb.append(line).append("\n");
    }
    zipOut.write(sb.toString().getBytes());
    zipOut.closeEntry();

    parameters.setFileNameInZip(safeGlobalTitle + ".pdf");
    zipOut.putNextEntry(null, parameters);
    // Note that we're not passing the password into this function. It seems pretty silly
    // to put a password protected pdf inside of a password protected zip file.
    ByteArrayOutputStream baos = requestsToPdf(globalTitle, generationDate, scrambleRequests, null);
    zipOut.write(baos.toByteArray());
    zipOut.closeEntry();

    zipOut.finish();
    zipOut.close();

    return baosZip;
  }